从位数组的子数组转换为int并且结果不正确

时间:2017-05-05 16:03:16

标签: arrays swift nsdata

我发现了这个问题。为了使问题集中在这个问题上,我编辑并重新格式化了问题。

历史:以前我使用的是NSData而不是Data。我应该使用Data所以我改变了问题。使用Data无法解决问题。我重新格式化了一点,以使问题突出。如果您遇到同样的问题,请参阅答案

===========

我正在使用Swift 3.1

我想将字节数组的子数组转换为Int

这就是我在这里所做的。

// I am extracting every 4 from the dataBytes and convert it to int
  var xDataArray = dataBytes[8...11]
  let xData = Data(buffer: UnsafeBufferPointer(start: &xDataArray, count: xDataArray.count))
  var xVal: Int32 = xData.withUnsafeBytes { $0.pointee }
  xVal = Int32(bigEndian: xVal)

  var yDataArray = dataBytes[12...15]
  let yData = Data(buffer: UnsafeBufferPointer(start: &yDataArray, count: yDataArray.count))
  var yVal: Int32 = yData.withUnsafeBytes { $0.pointee }
  yVal = Int32(bigEndian: yVal)

xVal和yVal是相同的,它们似乎是非常大的随机数。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

我解决了这个问题。

我正在使用dataBytes[8...11]来获取子代码,这是我获得NSData相同结果的地方。

相反,我使用xDataArray:[UInt8] = [dataBytes[8], dataBytes[9], dataBytes[10], dataBytes[11]]

  var xDataArray: [UInt8] = [dataBytes[8], dataBytes[9], dataBytes[10], dataBytes[11]]
  let xData = NSData(bytes: &xDataArray, length: xDataArray.count)
  var xVal: Int32 = 0
  xData.getBytes(&xVal, length: MemoryLayout<Int32>.size)
  xVal = Int32(bigEndian: xVal)

  var yDataArray: [UInt8] = [dataBytes[12], dataBytes[13], dataBytes[14], dataBytes[15]]
  let yData = NSData(bytes: &yDataArray, length: yDataArray.count)
  var yVal: Int32 = 0
  yData.getBytes(&yVal, length: MemoryLayout<Int32>.size)
  yVal = Int32(bigEndian: yVal)

注意: 如果来自服务器的Int是32位,请使用Int32代替Int