【发布时间】:2019-12-29 11:09:09
【问题描述】:
我有这个Int 号码,我必须通过网络传输。
我正在使用这个类扩展。
extension Data {
init<T>(from value: T) {
self = Swift.withUnsafeBytes(of: value) { Data($0) }
}
func to<T>(type: T.Type) -> T? where T: ExpressibleByIntegerLiteral {
var value: T = 0
guard count >= MemoryLayout.size(ofValue: value) else { return nil }
_ = Swift.withUnsafeMutableBytes(of: &value, { copyBytes(to: $0)} )
return value
}
}
我在 iOS 设备上使用它进行编码和发送:
let number = button.number
let buttonNumberData = Data(from:number)
do {
try session.send(buttonNumberData, toPeers: session.connectedPeers, with: .reliable)
} catch let error as NSError {
}
}
如果我此时执行po buttonNumberData,我会得到:
▿ 4 bytes
- count : 4
▿ pointer : 0x002e9940
- pointerValue : 3053888
▿ bytes : 4 elements
- 0 : 1
- 1 : 0
- 2 : 0
- 3 : 0
如果我用这个解码数据,
let buttonNumber = buttonNumberData.to(type: Int.self)
我有一个有效的号码。
然后,此Data 被传输并到达 macOS 计算机并使用相同的命令进行解码:
let buttonNumber = buttonNumberData.to(type: Int.self)
问题是 buttonNumber 总是nil,但如果我此时做一个po buttonNumberData,我有这个:
▿ 4 bytes
- count : 4
▿ pointer : 0x00007ffeefbfd428
- pointerValue : 140732920747048
▿ bytes : 4 elements
- 0 : 1
- 1 : 0
- 2 : 0
- 3 : 0
看似有效的数据。
Data 扩展类出现了一些与 macOS 工作方式相关的问题。
有什么想法吗?
【问题讨论】:
-
名称中的“不安全”部分再次出现
-
什么意思?
-
人们经常使用这些不安全的结构,却没有仔细考虑它们的不安全之处。在这种情况下,您了解到其中一个“不安全”的事情是您使您的代码显式依赖于机器的原始二进制布局,并尝试在设备之间可移植地使用它
-
啊,我明白了。就我而言,我忘记了通用 Int 定义将对应于不同平台上的不同位数......谢谢。
-
您也没有考虑整数表示的字节顺序,这也取决于架构。