gpt4 book ai didi

c++ - UDP 以无符号字符形式接收数据

转载 作者:太空宇宙 更新时间:2023-11-04 00:46:19 25 4
gpt4 key购买 nike

我正在尝试使用 UDP 从网络接收一些数据并对其进行解析。

这是代码,

char recvline[1024];
int n=recvfrom(sockfd,recvline,1024,0,NULL,NULL);

for(int i=0;i<n;i++)
cout << hex <<static_cast<short int>(recvline[i])<<" ";

打印输出,

19 ffb0 0 0 ff88 d 38 19 48 38 0 0 2 1 3 1 ff8f ff82 5 40 20 16 6 6 22 36 6 2c 0 0 0 0 0 0 0 0

但我期待这样的输出,

19 b0 0 0 88 d 38 19 48 38 0 0 2 1 3 1 8f 82 5 40 20 16 6 6 22 36 6 2c 0 0 0 0 0 0 0 0

ff 不应出现在打印输出中。

实际上我必须根据每个字符来解析这些数据,

喜欢,

parseCommand(recvline);

解析代码看起来,

void parseCommand( char *msg){

int commId=*(msg+1);

switch(commId){
case 0xb0 : //do some operation
break;

case 0x20 : //do another operation
break;
}
}

在调试时我得到了 commId=-80 on watch。

注意:在 Linux 中,我使用代码成功输出,请注意,我使用 unsigned char 而不是 char 作为读取缓冲区。

unsigned char recvline[1024];
int n=recvfrom(sockfd,recvline,1024,0,NULL,NULL);

在 Windows 中,recvfrom() 不允许第二个参数为 unsigned,这会导致构建错误,所以我选择了 char

最佳答案

看起来你可能得到了正确的值,但是你在打印符号时转换为 short int 会扩展你的 char 值,导致 ff 传播到顶部byte 如果你的 char 的最高位是 1(即它是负数)。您应该首先将其转换为无符号类型,然后扩展为 int,因此您需要 2 次转换:

cout << hex << static_cast<short int>(static_cast<uint8_t>(recvline[i]))<<" ";

我已经对此进行了测试,它的行为符合预期。

回应您的扩展:读取的数据很好,这取决于您如何解释它。要正确解析你应该:

  uint8_t commId= static_cast<uint8_t>(*(msg+1));

switch(commId){
case 0xb0 : //do some operation
break;

case 0x20 : //do another operation
break;
}

关于c++ - UDP 以无符号字符形式接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37674288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com