Swift中的Checksum和XOR

Pha*_*oan 5 bitwise-operators nsdata ios swift

我在Objective-C中对这些方法进行了研究.它们只是校验和而XORNSData

- (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;
}
Run Code Online (Sandbox Code Playgroud)

但是,我不熟悉Bitwise运算符,特别是在Swift中,有这些UnsafeMutablePointer<Void>...的东西.

任何人都可以帮我转换吗?(基本上,我需要校验和和XOR函数)还有
一件事,它们应该被NSData/NSMutableData扩展吗?

谢谢.

fin*_*all 9

UnsafeBufferPointer/ UnsafeMutableBufferPointer可能就是你现在所需要的.我已经尝试过将你的代码翻译成Swift.(但代码测试不好.)

func XOR(inputData: NSMutableData, withKey key: NSData) {
    let b = UnsafeMutableBufferPointer<UInt8>(start:
        UnsafeMutablePointer(inputData.mutableBytes), count: inputData.length)

    let k = UnsafeBufferPointer<UInt8>(start:
        UnsafePointer(key.bytes), count: key.length)

    for i in 0..<inputData.length {
        b[i] ^= k[i % key.length]
    }
}

func checkSum(data: NSData) -> Int {
    let b = UnsafeBufferPointer<UInt8>(start:
        UnsafePointer(data.bytes), count: data.length)

    var sum = 0
    for i in 0..<data.length {
        sum += Int(b[i])
    }
    return sum & 0xff
}
Run Code Online (Sandbox Code Playgroud)


Pha*_*oan 4

斯威夫特 3 更新:

public extension Data {

    public mutating func xor(key: Data) {
        for i in 0..<self.count {
            self[i] ^= key[i % key.count]
        }
    }


    public func checkSum() -> Int {
        return self.map { Int($0) }.reduce(0, +) & 0xff
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以创建另一个函数:xored(key: Data) -> Data
然后你可以链接这些运算符:xored(key).checksum()