首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C uint16整数还是char格式?

C uint16整数还是char格式?
EN

Stack Overflow用户
提问于 2013-10-15 12:15:59
回答 1查看 406关注 0票数 0

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

代码语言:javascript
复制
UINT16 port1
UINT16 port2

此测试的相应值为:

代码语言:javascript
复制
6005
5555

如果打印整个数据包缓冲区,就会得到如下内容:

代码语言:javascript
复制
u^W³^U><9e>^D

我如何打破它并得到正确的值?我尝试过uint16_tunsigned short,甚至函数htons,但也没有起作用--我只是得到了错误的数字,我正在尝试这样的方法:

代码语言:javascript
复制
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字符文本,所以我可能得到了错误的数字,因为我处理得像一个整数。但我什么都试过了,只是找不到合适的价值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-15 12:49:18

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

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

代码语言:javascript
复制
 unsigned short primaryPort = (buffer[l] & 0xff) | ((buffer[l+1] & 0xff) << 8 );

第二个港口也是一样。

编辑

它之所以有效,是因为:

在像buffer[l] & 0xff这样的表达式中,buffer[i]被隐式转换为int (搜索“整数提升”以了解更多信息)。如果0xffchar *的话,用char *掩蔽它是必要的:那么buffer[i]是一个签名的字符,因此,如果设置了最高位,它的值是负值(例如'\xff'是-1)。掩蔽它可以确保我们得到一个在0- 255范围内的正值。最后但并非最不重要的一点是,shift操作符<< 8将字节值转移到下一个更高的字节,即计算的int。最后,将完整操作的结果隐式地传递给unsigned short,因为计算出的int小于或等于0xffff,因此可以安全地执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19381004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档