본문 바로가기

iOS/Objective-c

[ObjC] NSData XOR 비트 연산 - 데이터 축약

32바이트 NSData를 XOR비트 연산하여 8바이트 크기로 생성.

 

C로 쓰니 메모리 에러가 너무 많이나서 호출하다보면 크러시가 남.

( Heap corruption detected 등등)

ObjC로 변경한 코드.

 

- (NSMutableData*) makeHashWithData:(NSData *)shaData {

    NSData *shaData1 = [shaData subdataWithRange:NSMakeRange(0, 16)];

    NSData *shaData2 = [shaData subdataWithRange:NSMakeRange(16, 16)];

    

    NSMutableData *result1 = [shaData1 mutableCopy];

    char *dataPtr = (char *) [result1 mutableBytes];

    char *keyData = (char *) [shaData2 bytes];

    

    char *keyPtr = keyData;

    int keyIndex = 0;

    

    for (int x = 0; x < [shaData1 length]; x++)

    {

        *dataPtr = *dataPtr ^ *keyPtr;

        dataPtr++;

        keyPtr++;

        

        if (++keyIndex == [shaData2 length])

            (void)(keyIndex = 0), keyPtr = keyData;

    }

    

    NSData *shaData11 = [result1 subdataWithRange:NSMakeRange(0, 8)];

    NSData *shaData22 = [result1 subdataWithRange:NSMakeRange(8, 8)];

    

    NSMutableData *result2 = [shaData11 mutableCopy];

    

    

    char *dataPtr2 = (char *) [result2 mutableBytes];

    char *keyData2 = (char *) [shaData22 bytes];

    

    char *keyPtr2 = keyData2;

    int keyIndex2 = 0;

    

    for (int x = 0; x < [shaData11 length]; x++)

    {

        *dataPtr2 = *dataPtr2 ^ *keyPtr2;

        dataPtr2++;

        keyPtr2++;

        

        if (++keyIndex2 == [shaData22 length])

            (void)(keyIndex2 = 0), keyPtr2 = keyData2;

    }

    return result2;

}

 

//-----------------------C language-------------------------//

- (NSMutableData *)makeHashWithData:(NSData *)shaData {

    

    NSUInteger len = [shaData length];

    char *former = (char*)malloc(len/2);

    char *latter = (char*)malloc(len/2);

    memcpy(former, &[shaData bytes][0], len);

    memcpy(latter, &[shaData bytes][16], len);

    

    char *xor = (char *)malloc(len/2);

    for (int i = 0; i< 16; i++) {

        xor[i] = former[i] ^ latter[i];

    }

    

    NSData *xorData = [NSData dataWithBytesNoCopy:xor length:16 freeWhenDone:YES];

    NSUInteger xlen = [xorData length];

    

    char *former1 = (char *)malloc(8);

    char *latter1 = (char *)malloc(8);

    memcpy(former1, &[xorData bytes][0], xlen/2);

    memcpy(latter1, &[xorData bytes][8], xlen/2);

    

    char *xor1 = (Byte *)malloc(xlen/2);

    for (int i = 0; i< 8; i++) {

        xor1[i] = former1[i] ^ latter1[i];

    }

 

    NSMutableData *xorData1 = [NSMutableData dataWithBytesNoCopy:xor1 length:8 freeWhenDone:YES];

    return xorData1;

}

 

참고링크)

https://stackoverflow.com/questions/724086/how-to-convert-nsdata-to-byte-array-in-iphone