gpt4 book ai didi

C uint16 整数或字符格式?

转载 作者:行者123 更新时间:2023-11-30 17:46:15 27 4
gpt4 key购买 nike

我是 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此字符上的字 rune 本 u^W³^U><9e>^D ,所以也许我得到了错误的数字,因为我像整数一样处理。但我已经尝试了一切,但就是无法获得正确的值。

最佳答案

当我查看您收到的缓冲区时,它确实以 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 掩盖它如果 buffer 是必要的是 char * :然后buffer[i]是一个有符号字符,因此,如果设置了最高位,则其值为负数(例如 '\xff' 为 -1)。屏蔽它可以确保我们得到 0 - 255 范围内的正值。最后但并非最不重要的一点是,移位运算符 << 8将字节值移动到计算出的下一个较高字节 int 。最后,完整操作的结果被隐式转换为 unsigned short这是可以安全完成的,因为计算出 int小于或等于0xffff。

关于C uint16 整数或字符格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19381004/

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