什么是android ByteBuffer.wrap(data.getFloat())的swift等价物?
我正在从事一个项目,在这个项目中,我必须从设备中读取数据,然后将其转换为字节数组,然后读取一些字节(4字节),并将它们转换为浮点值并使用它。我的代码在android中运行良好,但我无法正确转换代码。这是android代码什么是android ByteBuffer.wrap(data.getFloat())的swift等价物?,android,ios,swift,Android,Ios,Swift,我正在从事一个项目,在这个项目中,我必须从设备中读取数据,然后将其转换为字节数组,然后读取一些字节(4字节),并将它们转换为浮点值并使用它。我的代码在android中运行良好,但我无法正确转换代码。这是android代码 try { byte[] data = Arrays.copyOfRange(mScanRecord, 5, 9); //mScanRecord is byte array (byte[]) containing 11 byte sear
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中
值看起来不同,但如果将它们转换为十进制到十六进制,则它们是相同的。字节数组包含32位的大端表示形式 浮点值。您必须将其转换为主机字节顺序 (在当前所有苹果平台上都是little endian):
字节数组包含32位字节的大端表示 浮点值。您必须将其转换为主机字节顺序 (在当前所有苹果平台上都是little endian):
在我的例子中,浮点数是小尾端,我改变了这一行:
return Float(bitPattern: UInt32(littleEndian: value))
在我的例子中,浮点数是小尾端,我改变了这一行:
return Float(bitPattern: UInt32(littleEndian: value))
字节数组包含什么?你得到了什么样的结果?你期望得到什么您的Java代码还复制了字节5..8,Swift从数组中复制了字节7..10。@MartinR I更新了问题中的期望值,Java代码复制了5,6,7,8,Swift复制了7,8,9,10,因为Java中的字节数组长度是11字节,而在ios中是13字节,一开始,我在安卓系统中又得到了2个字节,所以我必须从7中选择值,字节数组包含什么???@MartinR补充了这个问题:字节数组包含什么?你得到了什么样的结果?你期望得到什么您的Java代码还复制了字节5..8,Swift从数组中复制了字节7..10。@MartinR I更新了问题中的期望值,Java代码复制了5,6,7,8,Swift复制了7,8,9,10,因为Java中的字节数组长度是11字节,而在ios中是13字节,一开始,我在安卓系统中又得到了2个字节,所以我必须从7中选择值,字节数组包含什么内容???@MartinR补充了这个问题
return Float(bitPattern: UInt32(littleEndian: value))