我想对NSData执行XOR操作,如下所示,修改一个只读的NSData(非ARC)是否安全?我试过了,它确实有效。
@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
答案 0 :(得分:1)
可以肯定地说这是一个绝对愚蠢的想法,会给你带来各种麻烦。对于初学者,猜猜如果你有一个原始的NSData对象并复制它会发生什么,然后尝试这个废话(如果它不首先崩溃)。我认为由此引起的任何损害都属于“故意”类别,这意味着您可能要对此负责。
答案 1 :(得分: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