我正在尝试将十六进制消息从 C 服务器传递到 Java 客户端。通讯有效。但是我在 Java 客户端上获得的十六进制值似乎附加了“ff”。为什么会这样?
在 C 端,当我打印要发送的字节(十六进制)时,它们看起来没问题。
请看下面的代码:
C服务器:
int datalen = 220;
/* create outgoing message */
idx = 0;
en_outmsg[idx++] = FEB & 0xFF;
en_outmsg[idx++] = ENT & 0xFF;
en_outmsg[idx++] = CBA & 0xFF;
en_outmsg[idx++] = GRP & 0xFF;
en_outmsg[idx++] = OUTGOING & 0xFF;
en_outmsg[idx++] = (datalen & 0xFF00) >> 8;
en_outmsg[idx++] = datalen & 0xFF;
for(i= 0; i<39; i++){
printf("en_outmsg[%d] to send = %x\n",i, en_outmsg[i]);
}
en_outmsg[i+1] = '\n';
if (send(connected, en_outmsg, 40, 0) > 0)
{
printf("sending over\n");
}
Java客户端:
while( (bytes =dis.read(buffer, 0, 40)) != -1){
for(int index=38; index >= 0; index--) {
System.out.println("index ="+index);
System.out.println("buffer ="+Integer.toHexString(buffer[index]));
}
System.out.println("bytes="+bytes);
len = 0;
len |= buffer[5];
len = len << 8;
len |= buffer[6];
System.out.println("value of len= "+len);
}
输出: len 的值= -36 缓冲区[5]=0 缓冲区[6]= 0xfffffffdc
更新
这是我的 wireshark 输出(这是 C 服务器推送到 Java 客户端的内容):
请注意,在第 5 行,“00 dc”对应于 datalen=220,它应该存储在 Java 客户端的 len 中。所以Java客户端显然有一些错误。就像你们都提到的那样,我可以使用 Integer.toHexString(((int)buffer[index]) & 0xFF) 进行打印。但我需要用正确的十六进制值存储字节数组。请帮忙
0000 00 00 03 04 00 06 00 00 00 00 00 00 00 00 08 00 ........ ........
0010 45 00 00 5c b4 75 40 00 40 06 a0 ac c0 a8 b2 14 E..\.u@. @.......
0020 c0 a8 b2 14 09 60 b7 bb fe bd 3a 2d fe 36 cc 8c .....`.. ..:-.6..
0030 80 18 02 20 e5 c8 00 00 01 01 08 0a 00 04 8e 5f ... .... ......._
0040 00 04 8e 5f 0a 01 01 16 01 00 dc 00 01 02 03 04 ..._.... ........
0050 05 06 07 08 09 0a 0b 0c 0d 0e 0f 2b 7e 15 16 28 ........ ...+~..(
0060 ae d2 a6 ab f7 15 88 09 cf 4f 3c d0 ........ .O<.