0

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

UINT16 port1
UINT16 port2

本次测试对应的值为:

6005
5555

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

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

所以我认为我只需要打破它并将其处理为unsigned int16 个字节。所以我尝试了这样的事情:

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

但是我得到了错误的 8 位数字。

我什至尝试了另一种方法,例如跟随,但也得到了错误的数字。

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

我做错了什么?另外,为什么我必须释放 char 字符串变量,但不需要释放 int 变量?

4

3 回答 3

0

您系统上的 unsigned int 可能是 4 个字节(uint32_t)。如果您屏蔽了正确字节序中的值,您可以在此处使用 unsigned int,或者只是使用一个短字节。

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);
于 2013-10-14T22:35:44.897 回答
0

您正在传递AddToLogsnprintf指向整数的指针。所以你看到的是整数的地址,而不是整数本身。

您需要取消引用您的指针 - 例如,在您的第一种方法primaryPort中的调用前面放置一个星号 (*)。AddToLog

正如@rileyberton 建议的那样,unsigned int您的系统上很可能是 4 个字节,即 C99 类型uint32_t。对于 16 位整数,使用uint16_t. 这些定义在stdint.h. 这些传统上称为“短整数”或“半整数”,需要%hu在或类似函数中使用限定符printf,而不仅仅是%u(代表unsigned int,其大小取决于目标机器。)

此外,正如@igor-tandetnik 建议的那样,您可能需要切换数据包中整数的字节顺序,例如,如果数据包使用网络顺序(大端)格式并且您的目标机器使用小端格式。

于 2013-10-14T22:48:05.153 回答
0

您声明primaryPortandsecondaryPort是指向unsigned short.

但是,当您从缓冲区的一部分为它们分配值时,您已经取消引用了指针。你不需要pointers-to-unsigned-short。你只需要一个unsigned short.

将其更改为:

unsigned short primaryPort = *((unsigned short*) &buffer[l]); 

unsigned short secondaryPort = *((unsigned short *) &buffer[l]); 

*请注意在变量声明中删除了 a 。

如果您仍然遇到问题,则需要buffer逐字节检查,寻找您期望的值。您可以预期6005它将显示为 hex17 7575 17,具体取决于您平台的endianness

于 2013-10-15T12:24:32.983 回答