我有这个 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)
我有一个有效的号码。
然后,此数据
被传输并到达 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
是 Swift 中的平台相关类型,它可以是 32 位或 64 位整数。
显然,您在 32 位设备上对整数进行编码,并在 64 位设备上对其进行解码。如果数据量小于整数大小,则解码方法返回nil
。
对于 4(或 8)字节的整数类型,使用 Int32
(或 Int64
)而不是 Int
,与平台无关.这适用于所有(当前)iOS 和 macOS 设备,因为它们都使用相同的(小端)字节顺序。
对于完全独立于平台的表示,将数据转换为明确定义的字节顺序,如所示 here .
关于ios - 在 iOS 上编码为数据的 Int 数字在 macOS 上解码后为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57637910/