2014-04-14 2 views
0

아래와 같이 NSData에 대해 XOR 연산을 수행하려고합니다.이 (비 ARC)와 같이 읽기 전용 NSData를 수정하는 것이 안전합니까? 나는 노력했다.포인터 주소를 통해 읽기 전용 NSData를 수정하는 것이 안전합니까?

@implementation NSData (Additions) 

    - (void)xorWithByteKey:(Byte)keyByte 
    { 
     char *curDataPtr = (char *)self.bytes; 

     for (int x = 0; x < self.length; x++) 
     { 
      *curDataPtr = *curDataPtr^keyByte; 
      curDataPtr++; 
     } 
    } 

    @end 

답변

1

CFData source code에서 무엇을하고 있는지 인 것으로 보입니다. 나는 _bytes (당신이 직접 접근하고있는 것)에 대한 참조를 빠르게 검색했고, 아무것도 나를 뛰어 넘지 못했습니다.

실제로 구현 세부 사항에 의존 할 위험이 있습니까? 데이터의 NSMutableData 복사본을 통해 대신 코드를 수정하는 것이 코드에 너무 비싸지 않습니까? 이 카테고리로

(검증되지 않은 경고) :

@interface NSData (xoring) 
- (NSData *) xorWithByteKey: (Byte) b ; 
@end 

@implementation NSData (xoring) 

- (NSData *) xorWithByteKey: (Byte) b { 

    NSMutableData * copy = [self mutableCopy] ; 

    char *p = (char *)copy.bytes; 

    for (NSUInteger i = 0, length = copy.length ; i < length; ++i) { 
     Byte c = *p ; 
     c ^= b ; 
     *p++ = c ; 
    } 
    return copy ; 
} 

@end

1

이것은 절대적으로 어리석은 생각이며 모든 종류의 문제를 일으킬 것입니다. 처음에는 원래 NSData 객체를 가지고 복사 한 다음이 말도 안되는 것을 시도해보십시오 (처음에 충돌하지 않는 경우). 나는 이것에 의해 야기 된 어떤 손상도 당신이 개인적으로 책임질 수 있음을 의미하는 "고의적 인"범주로 분류 될 것이라고 생각합니다.