2

我有一个包含十六进制值的 char 数组。它包含 6 个字节。我计算了这 6 个字节的 crc,函数返回 int 值。这是代码。

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 将作为 int 获得的 crc 转换为字节。但是计算出的 crc 存储在 4 字节而不是 2 字节中。我计算了 CRC 16,但结果 crc 是 32 位。我认为这是因为我在 crc 计算中返回了“int”,并且在 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 个字节是从 char 数组转换而来的字节,后 4 个字节是 crc。

4

2 回答 2

1

大端顺序的CRC的两个字节可以用

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

如果您需要它以小端顺序排列,只需相应地调整分配即可。

我不清楚为什么使用 char 数组来表示字节。

于 2014-01-02T08:54:20.653 回答
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

于 2014-01-02T08:56:22.147 回答