Java从字节数组中提取双精度数

时间:2015-09-28 22:01:27

标签: java c double byte bytearray

我无法从字节数组中提取一堆双精度数。使用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

哪个不起作用。我没有其他许多想法,也不太了解我的低级字节操作。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您的代码存在(至少)两个问题:

double st = data[0]&0xff<<8|data[1];

被解析为:

double st = ((data[0] & (0xff << 8)) | data[1];

您应该使用括号和空格来使您的代码更具可读性并与您的想法保持一致。

第二个问题:你假设大端字节排序,这种情况现在很少见。

顺便提一下,java中data的类型是什么?