这是旧的 Objective C 代码(令牌是 NSData):
const unsigned *tokenBytes = [credentials.token bytes];
NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
这是我将其转换为 Swift 的方法:
let tokenBytes = credentials.token.withUnsafeBytes { (bytes: UnsafePointer<[UInt]>) -> [UInt] in
return bytes[0] // Crash here
}
let hexToken = String(format: "%08x%08x%08x%08x%08x%08x%08x%08x",
UInt(bigEndian: tokenBytes[0]), UInt(bigEndian: tokenBytes[1]),
UInt(bigEndian: tokenBytes[2]), UInt(bigEndian: tokenBytes[3]),
UInt(bigEndian: tokenBytes[4]), UInt(bigEndian: tokenBytes[5]),
UInt(bigEndian: tokenBytes[6]), UInt(bigEndian: tokenBytes[7])
)
有谁知道我做错了什么?据我所知,我从 转换bytes
为withUnsafeBytes
正确,但似乎我错了。
你崩溃的原因是这个表达式:
bytes : UnsafePointer<[UInt]>
您假设数据代表一系列 UInt。所以指向数据开头的指针不像指向 a 的不安全指针[UInt]
,一个UInt数组;它是一个指向 UInt 的不安全指针,即系列中的第一个。你应该说:
bytes : UnsafePointer<UInt>
撞车就这么多。现在让我们来谈谈您在这里主要尝试做的事情。
我不确定字符串格式应该做什么,但我确实理解这个想法ntohl
是为了保证某些 C 长整数(32 位)的字节序。所以我将省略字符串格式部分,只讨论如何将接收到的 C long int 流转换为 Data 并反转 long int 的字节序。
假设d
是一个可变数据(即用 声明var
)。然后,假设它表示一系列 UInt32 little-endian 值,并且您想将它们转换为 big-endian,您会说:
let ct = d.count/4
d.withUnsafeMutableBytes{
(ptr:UnsafeMutablePointer<UInt32>) in
for ix in 0..<ct {
ptr[ix] = ptr[ix].bigEndian
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句