我是C编程方面的新手,我正在测试一些代码,在这些代码中,我接收和处理一个UDP数据包,格式如下:
UINT16 port1
UINT16 port2此测试的相应值为:
6005
5555如果打印整个数据包缓冲区,就会得到如下内容:
u^W³^U><9e>^D我如何打破它并得到正确的值?我尝试过uint16_t和unsigned 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值不是整数格式的,我认为它只是字符u^W³^U><9e>^D上的一个uint16字符文本,所以我可能得到了错误的数字,因为我处理得像一个整数。但我什么都试过了,只是找不到合适的价值。
发布于 2013-10-15 12:49:18
当我查看您收到的缓冲区时,它确实以6005 (小Endian)开头:
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是char *的话,用char *掩蔽它是必要的:那么buffer[i]是一个签名的字符,因此,如果设置了最高位,它的值是负值(例如'\xff'是-1)。掩蔽它可以确保我们得到一个在0- 255范围内的正值。最后但并非最不重要的一点是,shift操作符<< 8将字节值转移到下一个更高的字节,即计算的int。最后,将完整操作的结果隐式地传递给unsigned short,因为计算出的int小于或等于0xffff,因此可以安全地执行。
https://stackoverflow.com/questions/19381004
复制相似问题