Представление байтов Java в строке - PullRequest
0 голосов
/ 30 ноября 2011

Я получаю данные с аппаратного устройства.Я получаю это как массив байтов.Я хочу построить и сохранить строку, которая может показать мне данные массива байтов.Вот что у меня есть:

byte[] buffer = new byte[BUFFER_SIZE];
bytes = mmInStream.read(buffer);
String[] str = new String[bytes];
StringBuffer readMessage = new StringBuffer();

for(int i=0; i<bytes; ++i){
  str[i] = Integer.toHexString(buffer[i]);
   while (str[i].length() < 8){  //standarize size 
     str[i] = '0' + str[i];    
   }
  readMessage.append(str[i]);
}

Основная проблема, с которой я столкнулся, заключается в том, что я получаю неожиданные байты при преобразовании байтов в строку.Я получаю чистые байты, поэтому я ожидаю, что значения будут в диапазоне от 0x00 до 0xFF.Тем не менее, некоторые из байтов преобразуются в байты, такие как 0xFFFFFF09.Почему это происходит ??

Ответы [ 3 ]

2 голосов
/ 30 ноября 2011

Вы должны преобразовать byte в int таким образом:

int byteAsInt = ((int)buffer[i]) & 0x000000FF;
str[i] = Integer.toHexString(byteAsInt);
1 голос
/ 30 ноября 2011

байт является типом данных со знаком, поэтому 0xFF равно -1. При преобразовании в больший целочисленный тип он все равно будет равен -1, то есть 0xFFFF или 0xFFFFFFFF для 16- и 32-разрядных целочисленных значений.

Редактировать:

Если вы хотите получить значение без знака, выполните битовое И (&) с 0xFF при назначении переменной большего размера.

0 голосов
/ 30 ноября 2011

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

while (str [i] .length () <8) {// стандартизированный размер str [i] = '0'+ str [i]; <br>}

Чего бы вы хотели достичь?Печать 0xFF вместо FF?В этом случае просто измените одну строку следующим образом:

str[i] = "0x" + Integer.toHexString(buffer[i]);

и удалите внутренний цикл.

...