我试图在Swift中实现AES 128,但最近遇到了将Swift字符串写入CChar数组的问题:

let testString = "myTestString"

var keyPtr = [CChar](count: kCCKeySizeAES128 + 1, repeatedValue: 0)
bzero(&keyPtr, strideof(keyPtr.dynamicType))
testString.getCString(&keyPtr, maxLength: strideof(keyPtr.dynamicType), encoding: NSUTF8StringEncoding)
print(keyPtr)

在32位设备(iPad2、iPad4)上,此日志:
[109, 121, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

在64位设备(iPhone 6、Macbook Pro i7)上,此日志:
[109, 121, 84, 101, 115, 116, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

64位大小写是正确的结果,而32位结果不是。
我也遇到了与withCString相同的问题:
testString.withCString({
    print($0)
})

在32位设备上,它记录0x7a992094,而64位设备记录0x00007f853c123760
如何在所有架构中使getCStringwithCString的结果相同?这是CChar的大小问题还是不同体系结构上的阵列问题?

最佳答案

缺点是:strideof(keyPtr.dynamicType)
它与strideof(Array<CChar>)相同,其值为32位4,64位8。
您需要这样修改代码:

bzero(&keyPtr, keyPtr.count) //<-this is not needed, as you are specifying `0` for `repeatedValue`.
testString.getCString(&keyPtr, maxLength: keyPtr.count, encoding: NSUTF8StringEncoding)

07-28 03:13