我无法从字节数组中提取一堆双精度数。使用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
哪个不起作用。我没有其他许多想法,也不太了解我的低级字节操作。
答案 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
的类型是什么?