从NSData

时间:2017-12-07 15:35:53

标签: ios objective-c swift bitarray

我正在尝试使用C库加密十六进制字符串,这是一个连接Swift,Objective-C和C的英雄壮举。

但是,当我将NSData转换为String时,最终结果为nil

我从这开始:

let fakeHex = "9F1D53E732E48F25F94711D5B22086778278624F715D9B2BEC8FB81134E7C904".toData()
let data = Data(repeating: 1, count: 32)

data是一组32 true

fakeHex是一个硬编码的十六进制,我通过以下扩展名对UTF8进行编码:

extension String {

    func toData() -> Data {
        let data = NSMutableData()
        let terminator = [0]
        for char in self {
            let encodedString = String(char).data(using: .utf8)!
            data.append(encodedString)
            data.append(terminator, length: 1)
        }

        return Data(referencing: data)
    }

}

接下来,我有一个名为Blakey的Objective-C类,它使用十六进制NSDatatrue s NSData并通过Blake2对它们进行哈希处理哈希算法:

let x = Blakey().createKeyPair(withHexData: fakeHex, andIndexData: data) 

^这也会返回一些NSData

- (NSData *)createKeyPairWithHexData:(NSData *)data andIndexData:(NSData *)indexData;
{
    struct blake2b_state__ state;
    blake2b_init(&state, 32);

    blake2b_update(&state, data.bytes, data.length); // data.length is 128
    blake2b_update(&state, indexData.bytes, indexData.length); // indexData.length is 32

    void *foo = malloc(32);
    blake2b_final(&state, foo, 32);

    NSData *accountKey = [NSData dataWithBytes:foo length:32];

    free(foo);

    return accountKey;
}

此代码的模型取决于Python中的配套实现中发生的事情:

def seed_account(seed, index):
    # (seed here is our hex string, index is 1)
    # Given an account seed and index #, provide the account private and public keys
    h = blake2b(digest_size=32)

    seed_data = BitArray(hex=seed)
    seed_index = BitArray(int=index,length=32)

    h.update(seed_data.bytes)
    h.update(seed_index.bytes)

    return account_key = BitArray(h.digest())

最后,我从NSData函数中取出Blakey并尝试将其转换为字符串:

NSString(data: x!, encoding: String.Encoding.utf8.rawValue)
String(data: x!, encoding: .utf8)

两者都打印nil

我在这个过程中做错了什么,不确定是什么。如果有什么突出的话,会喜欢一些帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

在每个字符后附加终结符,但是您可能希望将其附加到字符串的末尾(这一个data.append(terminator, length: 1)