我把这些方法写在C语言中。他们只是校验和和异或一些NSData
- (void)XOR:(NSMutableData *)inputData withKey:(NSData *)key
{
unsigned char* inputByteData = (unsigned char*)[inputData mutableBytes];
unsigned char* keyByteData = (unsigned char*)[key bytes];
for (int i = 0; i < [inputData length]; i++)
{
inputByteData[i] = inputByteData[i] ^ keyByteData[i % [key length]];
}
}
- (Byte)checkSum:(NSMutableData *)data withLength:(Byte)dataLength
{
Byte * dataByte = (Byte *)malloc(dataLength);
memcpy(dataByte, [data bytes], dataLength);
Byte result = 0;
int count = 0;
while (dataLength>0) {
result += dataByte[count];
dataLength--;
count++;
};
result = result&0xff;
return result&0xff;
}
然而,我不熟悉位运算符,特别是在Swift中,这些UnsafeMutablePointer<Void>
...东西
有人能帮我转换吗?(基本上,我需要校验和和异或功能)
还有一件事,它们应该放在NSData/NSMutableData
扩展中吗?
谢谢
5条答案
按热度按时间46scxncf1#
UnsafeBufferPointer
/UnsafeMutableBufferPointer
可能是您现在需要的。我试着把你的代码翻译成Swift。(但代码没有经过很好的测试。dfddblmv2#
Swift 3更新:
您还可以创建另一个函数:
xored(key: Data) -> Data
。然后你可以链接这些操作符:
xored(key).checksum()
ghhkc1vu3#
Swift支持运算符重载,让你可以轻松做
let xorData = data1 ^ data2
。我写了一个扩展,用于非相似大小的数据到xor。laik7k3q4#
Swift 3更新:
lqfhib0f5#
Swift可以很容易地将
Data
对象视为字节数组,您可以使用zip
和map
的组合进行操作,从而避免了for
循环的需要。这导致了更简洁和更可读的代码: