Java 从字节数组中提取双精度值
Java extracting doubles out of a byte array
我在从字节数组中提取一堆双打时遇到问题。使用 c 我能够做到这一点:
int16_t* data = (int16_t*)byte_array;
double st = data[0]; //first two bytes should be st or 29811
double et = data[9]; //last two bytes should be et or 29797
double accX = data[1];
double accY = data[2];
double accZ = data[3;
double gyroX = data[4];
...
>> st = 29811
>> et = 29797
但现在我正在尝试使用 java (android) 重写我的代码。我来的数据是正确的,因为我可以做到:
double s = data[0];
Log.i(TAG, "s: "+s); //ascii value for s is 115
>> s: 115
但我需要能够提取 st 和 et 之间的数据,我认为它们都是双打。我试过这样的事情:
double st = data[0]&0xff<<8|data[1];
>> st: 115
没用。我没有太多其他想法,也不太了解我的低级字节操作。
ByteBuffer
可能会有所帮助,因为它可以让您阅读 double
的 IEEE 754 表示。也就是说,您的 C 代码看起来像是一次获得 16 位,为此您可以调用 ByteBuffer.getShort()
?
ByteBuffer buffer = ByteBuffer.wrap(data);
buffer.order(ByteOrder.LITTLE_ENDIAN);
double st = buf.getShort();
double accX = buf.getShort();
double accY = buf.getShort();
...
double et = buf.getShort();
您的代码(至少)有两个问题:
double st = data[0]&0xff<<8|data[1];
解析为:
double st = ((data[0] & (0xff << 8)) | data[1];
您应该使用括号和空格来使您的代码更具可读性并与您的想法保持一致。
第二个问题:您假设大端字节顺序,这在当今相当罕见。
顺便问一下,java中data
的类型是什么?
我在从字节数组中提取一堆双打时遇到问题。使用 c 我能够做到这一点:
int16_t* data = (int16_t*)byte_array;
double st = data[0]; //first two bytes should be st or 29811
double et = data[9]; //last two bytes should be et or 29797
double accX = data[1];
double accY = data[2];
double accZ = data[3;
double gyroX = data[4];
...
>> st = 29811
>> et = 29797
但现在我正在尝试使用 java (android) 重写我的代码。我来的数据是正确的,因为我可以做到:
double s = data[0];
Log.i(TAG, "s: "+s); //ascii value for s is 115
>> s: 115
但我需要能够提取 st 和 et 之间的数据,我认为它们都是双打。我试过这样的事情:
double st = data[0]&0xff<<8|data[1];
>> st: 115
没用。我没有太多其他想法,也不太了解我的低级字节操作。
ByteBuffer
可能会有所帮助,因为它可以让您阅读 double
的 IEEE 754 表示。也就是说,您的 C 代码看起来像是一次获得 16 位,为此您可以调用 ByteBuffer.getShort()
?
ByteBuffer buffer = ByteBuffer.wrap(data);
buffer.order(ByteOrder.LITTLE_ENDIAN);
double st = buf.getShort();
double accX = buf.getShort();
double accY = buf.getShort();
...
double et = buf.getShort();
您的代码(至少)有两个问题:
double st = data[0]&0xff<<8|data[1];
解析为:
double st = ((data[0] & (0xff << 8)) | data[1];
您应该使用括号和空格来使您的代码更具可读性并与您的想法保持一致。
第二个问题:您假设大端字节顺序,这在当今相当罕见。
顺便问一下,java中data
的类型是什么?