私はTCPソケットのメッセージを受け取り、uint8_t
の配列に格納しようとしています。 受信するバッファは8バイト長で、4つの一意の値を含んでいます。 バイト1:uint8_tの値1、バイト2-3:uint16_tの値2、バイト4:uint8_tの値3、バイト5-8:符号なしlongの値4。 エンディアンはビッグエンディアンのオーダーです。uint8_tの配列からさまざまなサイズの値を抽出する方法は?
int numBytes = 0;
uint8_t buff [8];
if ((numBytes = recv(sockfd, buff, 8, 0)) == -1)
{
perror("recv");
exit(1);
}
uint8_t *pt = buff;
printf("buff[0] = %u\n", *pt);
++pt;
printf("buff[1] = %u\n", *(uint16_t*)pt);
ただし、2番目のprintf
は予期しない値を出力します。私は2バイトを抽出するために何かを間違ってやったのですか、あるいは私の印刷機能に何か問題がありますか?
お答えすることは不可能で、あなたが何を「バイト2-3:値2」を説明するまでの手段、それらのバイトが値に変換されなければならない、すなわち、どのように。値4と同じです。 –
マルチバイト値のエンディアンはわかりませんが、配列として 'buff'を直接索引付けするのではなく、ポインタを使用して問題を複雑にする目的がありません。要素ごとに値を設定します。 –
私には明らかな@PeteBecker:値2は第2の値を意味します。 –