【问题标题】:Int number encoded as Data on iOS is nil after being decoded on macOS在 macOS 上解码后,在 iOS 上编码为 Data 的 Int 数为零
【发布时间】: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 定义将对应于不同平台上的不同位数......谢谢。
  • 您也没有考虑整数表示的字节顺序,这也取决于架构。

标签: ios swift macos swift4


【解决方案1】:

Int 是 Swift 中依赖于平台的类型,它可以是 32 位或 64 位整数。

显然,您在 32 位设备上对整数进行编码并在 64 位设备上对其进行解码。如果数据量小于整数大小,解码方法返回nil

使用Int32(或Int64)代替Int 用于4(或8)字节的整数类型,与平台无关。这适用于所有(当前)iOS 和 macOS 设备,因为它们都使用相同的(小端)字节顺序。

对于完全独立于平台的表示,将数据转换为明确定义的字节顺序,如 here 所示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2016-02-16
    • 2012-05-04
    相关资源
    最近更新 更多