2013-08-09 6 views
1

Я разбираю массив байтов, который содержит переменные разных типов. Я получаю этот массив из HID, подключенного к моему телефону. Массив был сделан программистом С. Я пытаюсь разобрать его, используя класс ByteBuffer:Байт Parse C байтов в Java ByteBuffer.

byte[] buffer = new byte[64]; 
if(connection.bulkTransfer(endpoint, buffer, 64, 1000) >= 0) 
{ 
    ByteBuffer byteBuffer = ByteBuffer.wrap(buffer); 
    char mId = byteBuffer.getChar(); 
    short rId = byteBuffer.getShort(); 
    // ............................ 
} 

Но значения этих переменных не являются правильными. Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно?

+0

Я предполагаю, что соединение означает, что вы получаете его по сети? Как насчет мало-по-крупному, т. Е. Порядка байтов. – Zhe

ответ

3

Если порядок байтов (мало по сравнению с обратным порядком байтов) является проблемой, вы можете установить порядок байтов ByteBuffer к родным, не меняя все программы:

ByteBuffer byteBuffer = ByteBuffer.wrap(buffer); 
byteBuffer.order(ByteOrder.nativeOrder()); // Set native byte order 
char mId = byteBuffer.getChar(); 
short rId = byteBuffer.getShort(); 

С другой стороны, если вы найдете ByteBuffer объекты более удобные, чем байтовые массивы, скажите программисту C вернуть вам direct byte buffer вместо массива: проще для всех сторон и, вероятно, более эффективно.

+0

+1 для 'ByteOrder.nativeOrder()'. – m0skit0

+0

Некоторые переменные имеют тип unsigned char или unsigned short. Правильно ли использовать для них методы getShort() или getChar()? – floyd

+0

Правильно, бит один и тот же. Знак влияет только на то, как значение отображается или преобразуется в более широкие типы. – Joni

4

Существуют системы с ордером LitteEndian Byte и BigEndian.

java использует BigEndian.

Если с программист написал массив байтов в Little Endian, вы могли бы использовать DataInputStream на основе Appache LittleEndianInputStream:

LittleEndianInputStream leis = new LittleEndianInputStream(is); 
DataInputStream dis = new DataInputStream(leis); 

int i1 = dis.readInt(); 
short s2 = dis.readShort(); 

Если вы и ваш коллега определить бинарный интерфейс (файл или массив байтов) вы всегда должен форсировать определенный байтовый порядок (либо маленький, либо большой эндиан).

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