2015-09-28 2 views
0

У меня возникли проблемы с извлечением пучка парных чисел из массива байтов. С помощью C Я был в состоянии сделать это:Java-извлечение удваивается из байтового массива

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 

Но мне нужно, чтобы быть в состоянии вытащить данные между ЗБ и др которые я думаю, что все двойники. Я пробовал что-то вроде этого:

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

Какой из них не работает. У меня нет много других идей, и я не очень хорошо разбираюсь в малой манипуляции с низким уровнем.

+0

Я рекомендую хотя бы использовать круглые скобки ... '((данные [0] & 0xff) << 8) | (данные [1] & 0xff) ' – immibis

+0

Есть ли причина для' & 0xff'? Я не думал, что есть, но я видел массу других ответов, где люди это делали. –

+1

'byte' подписаны на Java. Таким образом, 255 становится -1, 254 становится -2, ..., 128 становится -128. '& 0xff' - это быстрый способ отменить это. – immibis

ответ

0

ByteBuffer может помочь, так как он позволяет вам прочитать представление IEEE 754 от double. Тем не менее, ваш 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(); 
+0

Как мне компенсировать смещение? –

+0

Вызов 'getShort (offset)'? –

+0

Perfect. Посмотрев еще раз на ByteBuffer (это момент «duh»), я обнаружил, что он работает как буфер, поэтому каждый раз, когда вы вызываете getShort(), он перемещается по массиву к следующим значениям. –

0

Есть (по крайней мере) две проблемы с вашим кодом:

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

обрабатывается как:

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

Вы должны использовать круглые скобки и пробелы, чтобы сделать ваш код и более удобным для чтения и в соответствии с вашими идеями.

Вторая проблема: вы принимаете большой байтовый порядок байтов, что в наши дни довольно редки.

Кстати, какой тип data в java?

+0

данные представляют собой массив байтов. –

Смежные вопросы