2013-10-14 109 views
0

我在C程序设计新和我测试一些代码,我接收和处理格式化为后续一个UDP包:C UINT16如何正确使用?

UINT16 port1 
UINT16 port2 

在这个测试的相应的值是:

6005 
5555 

如果我打印整个数据包缓冲区我得到的是这样的:

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

所以我想,我只想必须将其分解并处理为16字节的unsigned int。所以我试过这样的事情:

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); 

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

+2

如果您问的是C,为什么C++和C#中的标签? – n0rd

+1

最有可能的是,在你的系统中'unsigned int'实际上不是一个16位整数,而'sizeof(unsigned int)!= 2'。并且'*(unsigned int)&buffer [l]'没有任何意义(也不能编译):你正在投射一个指向一个整数的指针,然后试图解引用这个整数。 –

+1

“另外,为什么我必须释放char字符串变量,但是我不需要释放int变量?”无论你是否需要调用'free',都不是变量类型的问题。 –

回答

0

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

您需要取消引用您的指针 - 例如,在您的第一种方法中,在primaryPort之前在号码AddToLog的前面加上星号(*)。

正如@rileyberton所示,最有可能的是unsigned int是4字节在您的系统上,这是C99类型uint32_t。对于16位整数,请使用uint16_t。这些在stdint.h中定义。这些都是传统上被称为“短整型”或“半整数”,并要求在printf或类似功能的%hu预选赛,而不仅仅是%u(代表unsigned int,其大小取决于在目标机器上。)

而且, @ igor-tandetnik认为,如果例如数据包使用网络顺序(big-endian)格式,并且目标机器使用的是小端格式,则可能需要切换数据包中整数的字节顺序。

0

系统上的unsigned int可能是4个字节(uint32_t)。如果你用正确的字节数掩盖了值,或者简单地使用short,你可以在这里使用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); 
+1

或..你知道..'uint16_t'。 – Thomas

0

您声明primaryPortsecondaryPort是指向unsigned short的指针。

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

将其更改为:

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

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

注意在变量声明中移除*的。

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