什么是快速等效的android ByteBuffer.wrap(data).getFloat()?

时间:2017-09-19 10:10:53

标签: android ios swift

我正在开发一个项目,我必须从设备读取数据,然后将其转换为字节数组,然后读取一些字节(4字节)并将它们转换为float并使用它。我的代码工作正常,但在Android但我无法正确转换代码。这是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);
    }

这是我在swift中转换的代码

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)))

它给了我价值,但价值与android

非常不同

修改 我期待着价值 2.0405695(就像在android中一样)

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

在Android中

enter image description here

值看起来不同但如果将它们转换为十进制为十六进制

则相同

2 个答案:

答案 0 :(得分:1)

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

transform: translate3d(0,0,0);

答案 1 :(得分:0)

在我的情况下,浮点数是小尾数,因此我更改了这一行:

return Float(bitPattern: UInt32(littleEndian: value))