我试图在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
。如何在所有架构中使
getCString
或withCString
的结果相同?这是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)