android - android ByteBuffer.wrap(data).getFloat() 的 swift 等价物是什么?

标签 android ios swift

我正在做一个项目,我必须从设备读取数据,然后将其转换为字节数组,然后读取一些字节(4 字节)并将它们转换为 float 并使用它。我有工作正常但在 android 中的代码,但我无法正确转换代码。这是安卓代码

try {
          byte[] data = Arrays.copyOfRange(mScanRecord, 5, 9); //mScanRecord is byte array (byte[]) containing 11 byte
          searchModel.setData("" + ByteBuffer.wrap(data).getFloat());
    } catch (Exception e) {
          e.printStackTrace();
          searchModel.setData("" + 0);
    }

这是我快速转换的代码

typealias Byte = UInt8

func fromByteArray<T>(_ value: [UInt8], _: T.Type) -> T {
    return value.withUnsafeBytes {
        $0.baseAddress!.load(as: T.self)
    }
}

func getUnitValue(byteArray:[UInt8]) -> Float {
    let value = fromByteArray([byteArray[7], byteArray[8], byteArray[9], byteArray[10]], Float.self)

    return value
}

..... In Some function I call .....
searchModel.setData(data: String(format: "%.10f", getUnitValue(byteArray: byteArray)))

它给了我值(value),但值(value)与 android 有很大不同

编辑 我期待周围的值(value) 2.0405695(和安卓一样)

2.0405587

2.0526589

但是我得到了

547669365842.0000

-652321236542.0000

0.000000103

两个设备中的值每隔几秒更改一次

在 iOS 中

Printing description of byteArray:
▿ 13 elements
  - 0 : 195
  - 1 : 4
  - 2 : 1
  - 3 : 213
  - 4 : 130
  - 5 : 0
  - 6 : 0
  - 7 : 64
  - 8 : 2
  - 9 : 152
  - 10 : 178
  - 11 : 213
  - 12 : 130

在安卓中

enter image description here

值看起来不同,但如果将它们转换为十进制到十六进制,这些值是相同的

最佳答案

字节数组包含 32 位的 big endian 表示 浮点值。您必须将其转换为主机字节顺序 (在所有当前的 Apple 平台上都是小端):

func getUnitValue(byteArray:[UInt8]) -> Float {
    let value = fromByteArray([byteArray[7], byteArray[8], byteArray[9], byteArray[10]], UInt32.self)
    return Float(bitPattern: UInt32(bigEndian: value))
}

let array: [UInt8] = [195, 4, 1, 213, 130, 0, 0, 64, 2, 152, 178, 213, 130]

print(getUnitValue(byteArray: array)) // 2.0405587

关于android - android ByteBuffer.wrap(data).getFloat() 的 swift 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46297739/

相关文章:

ios - swift:解压缩文件时显示 UIActivityIndi​​catorView

java - RecyclerView 没有在底部调用 onScrolled

android - C++ android assetmanager 从应用程序内部目录读取文件

iphone - 使用 iOS 开发计算机视觉应用程序

iphone - 如何在iPhone的速度计中旋转图像

ios - 如何使用 iOS8 Social Framework Swift 将视频文件附加到 Publish on Facebook

android - 适用于Android的最佳Twitter API

android - 如何从文件夹运行./gradlew命令?

ios - 如何在 Swift 中将多个图像上传到单个推文中?

swift - 需要调整 NSJSONSerialization 到 iOS10