0

我是 C 编程的新手,我正在测试一些代码,在这些代码中我接收和处理格式如下的 UDP 数据包:

UINT16 port1
UINT16 port2

本次测试对应的值为:

6005
5555

如果我打印整个数据包缓冲区,我会得到如下信息:

u^W³^U><9e>^D

我怎样才能打破它并获得正确的价值观?我已经尝试过uint16_tunsigned short甚至是函数htons,但也没有用我只是得到错误的数字,我正在尝试这样的事情:

int l = 0;
unsigned short *primaryPort = *(unsigned short*) &buffer[l]; 
AddToLog(logInfo, "PrimaryPort: %u\n", primaryPort);
l += sizeof(*primaryPort);
unsigned short *secondaryPort = *(unsigned short *) &buffer[l]; 
AddToLog(logInfo, "SecondaryPort: %u\n", secondaryPort);
l += sizeof(*secondaryPort);

获得这些值的正确或最佳方法是什么?我认为这两个 uint16 值不是整数格式,我认为这只是这个uint16字符上的一个字符文本u^W³^U><9e>^D,所以我可能得到错误的数字,因为我正在像整数一样处理。但是我已经尝试了所有方法,但我无法获得正确的值。

4

1 回答 1

0

当我查看您收到的缓冲区时,它确实以 6005(小端序)开头:

6005 是 0x1775,前两个字符是u(0x75) 和Ctrl-W(0x17)。因此,您应该通过以下方式获取 int 值:

 unsigned short primaryPort = (buffer[l] & 0xff) | ((buffer[l+1] & 0xff) << 8 );

辅助端口也是如此。

编辑

它之所以有效,是因为:

在类似的表达式buffer[l] & 0xff中,buffer[i]被隐式转换为int(搜索“整数提升”以了解更多信息)。0xff如果bufferis ,则必须使用它来屏蔽它char *: Thenbuffer[i]是一个有符号字符,因此,如果设置了最高位,则它的值为负数(例如'\xff'-1)。屏蔽它可以确保我们得到一个 0 - 255 范围内的正值。最后但并非最不重要的一点是,移位运算符<< 8将字节值移动到计算的下一个更高字节int。最后,完整操作的结果被隐式转换为unsigned short可以安全完成的结果,因为计算int的结果小于或等于 0xffff。

于 2013-10-15T12:49:18.703 回答