CサーバーからJavaクライアントに16進メッセージを渡そうとしています。通信は機能します。しかし、Javaクライアントで取得した16進値には、「ff」が追加されているようです。なぜこうなった?
C側では、送信したいバイトを(16進数で)出力すると、問題ないように見えます。
以下のコードを参照してください。
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);
}
OutPut:lenの値= -36 buffer [5] = 0 buffer [6] = 0xfffffffdc
更新しました
これが私のwiresharkの出力です(これはCサーバーがJavaクライアントにプッシュするものです):
行5の「00dc」はdatalen=220に対応し、Javaクライアントのlenにそのまま保存する必要があることに注意してください。したがって、Javaクライアントには明らかにエラーがあります。皆さんがおっしゃったように、私はInteger.toHexString(((int)buffer [index])&0xFF)を使用して印刷できます。ただし、バイト配列を正しい16進値で格納する必要があります。助けてください
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<.