2014-01-02 2 views
2

У меня есть массив символов, содержащий шестнадцатеричное значение. Он содержит 6 байтов. Я вычислил crc этих 6 байтов, и функция возвращает значение int. Это код.Извлечь определенный байт из массива char и байтового массива в java

char buffer[] = {0x01,0x05,0x00,0x06,0x00,0x00}; 

byte[] bufferbyte = new String(buffer).getBytes(); 
for (byte bb : bufferbyte){ 
    System.out.format("0X%x ", bb); 
} 

int crcresult; 
crcresult = CRC16(buffer,6); //crc calculation 

byte[] crc_bytes = ByteBuffer.allocate(4).putInt(crcresult).array(); 

for (byte b : crc_bytes){ 
    System.out.format("0X%x ", b); 
} 

Мой вопрос являются

  1. Я использовал ByteBuffer преобразовать CRC, полученный в междунар в байте. Но вычисленный crc хранится в 4 байтах вместо 2 байтов. Я вычислил CRC 16, но результат crc равен 32 бит. Я думаю, что это потому, что я вернул «int» в вычислении crc и написано, что в java int 32 бит.

    Итак, как извлечь только два байта из байтового буфера (crc_bytes) или рассчитанного int crc (crcresult).

  2. Я поместил байты «char buffer []» и два байта рассчитанного crc в одиночном байтовом массиве. Как мы можем добавить

    char buffer[] and crcresult 
    

    в одном массиве.

Выход выше код

0X1 0X5 0X0 0X6 0X0 0X0 0X0 0X0 0X2d 0Xcb 

где первые 6 байт байт, преобразованные из массив символов и последние 4 байта CRC.

ответ

0

Да, crcresult - 32 бита, потому что он имеет тип int. Если вы хотите использовать 16-битный тип данных, используйте вместо этого short.

Но, используя тип int, не наносит никакого вреда. Хотя это 32 бит, только последние 16 бит будут содержать значение CRC16. Вы можете извлечь эти два байта со следующими побитовыми операциями.

byte byte1 = (byte)((crcresult >> 8) & 0xFF); // first 8 bits of last 16 bits 
byte byte0 = (byte)(crcresult & 0xFF);  // last 8 bits 

Чтобы слить результаты.

byte[] merged = new byte[bufferbyte.length + 2]; 
System.arrayCopy(bufferbyte, 0, merged, 0, bufferbyte.length); // copy original data buffer 
merged[bufferbyte.length ] = byte1;      // append crc16 byte 1 
merged[bufferbyte.length + 1] = byte0;      // append crc16 byte 2 

См. System.arrayCopy для получения более подробной информации.

+0

Благодарим вас за ответ. bu код показывает ошибку как «Исключение в потоке» main «java.lang.ArrayStoreException \t на java.lang.System.arraycopy (собственный метод) \t на CRC.CRCLikeC.main (CRCLikeC.java:93)" at Линия System.arraycopy. нам нужно добавить что-то еще, чтобы заставить его работать. – user3048644

+0

Извините, мой предыдущий код имел ошибку. Я исправил его здесь. раньше я копировал с char [] в байт [], теперь он исправлен. Повторите попытку? – bgamlath

1

Два байта стс в большом порядке Endian может быть извлечена с

byte[] crc_result = new byte[2]; 
crc_bytes[0] = (byte)(crcresult >> 8); // this are the high order 8 bits 
crc_bytes[1] = (byte)crcresult; // this are the low order 8 bits 

Если вам это нужно в маленьком порядке Endian просто адаптировать задания соответственно.

Непонятно, почему вы используете массив символов для представления байтов.

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