我正在做一个项目,我必须从设备中读取数据,然后将其转换为字节数组,然后读取一些字节(4字节),并将它们转换为浮点并使用它。我的代码运行良好,但在安卓系统,但我无法正确转换代码。这是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)))
它给了我价值,但价值与安卓大不相同
编辑
我在期待价值
2.0405695(类似于android)
二点零四零五五八七
二点零五二六五八九
但是我得到了
五千四百七十六亿六千九百三十六万五千八百四十二
-652321236542.0000个
零点零零零零零零一零三
两个设备中的值每隔几秒更改一次
在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
在安卓系统中
值看起来不同,但如果将它们转换为十进制到十六进制,则它们是相同的
最佳答案
字节数组包含32位
浮点值。你必须把它转换成主机字节顺序
(这在目前所有的苹果平台上都是小恩迪安):
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