如何在char数组的两个字节中存储16位数?

时间:2011-11-30 13:53:32

标签: c arrays sockets network-programming

我需要在char数组中存储一个端口号,以便可以将其写入套接字。该协议指定字节25和26用于端口号。我尝试过各种各样的东西,但这就是我现在要存储的数字:

//msg is declared as char msg[50];
msg[25] = (uint8_t) (UDP_PORT / 256);
msg[26] = (uint8_t) (UDP_PORT % 256);

然后恢复插座另一侧的号码:

uint8_t msb, lsb;
msb = msg[25];
lsb = msg[26];
int port =  msb * 256 + lsb;

任何提示将不胜感激。

4 个答案:

答案 0 :(得分:1)

你尝试过,转移过,还是操作?

msg[25] = (uint8_t) ((UDP_PORT >> 8) & 0xff);
msg[26] = (uint8_t) (UDP_PORT & 0xff);

然后

uint8_t msb, lsb;
msb = msg[25];
lsb = msg[26];
int port =  (msb << 8) | lsb;

您确定UDP_PORT是16位值吗? ...因为如果它是32位,则删除将无法隔离msb。当然,逐位操作会。

答案 1 :(得分:1)

以多字节二进制格式发送整数的大多数协议将以网络字节顺序发送值,以实现跨平台边界的一致性。使用套接字API的htons()ntohs()函数在主机字节顺序(本地机器本身使用的内容)和网络字节顺序之间转换整数,例如:

发送:

uint16_t *ptr = (uint16_t*) &msg[25];
*ptr = htons(UDP_PORT);

接收:

uint16_t *ptr = (uint16_t*) &msg[25]; 
int port = ntohs(*ptr); 

答案 2 :(得分:0)

也许这就是你想要的:

/* if UDP_PORT is a variable, and local machine is big-endian */
unsigned char *ptr = (unsigned char *)&UDP_PORT;
msg[25] = *ptr;
msg[26] = *(ptr + 1);

然后:

/* if msg is a address variable */ 
unsigned short *ptr = (unsigned short *)(msg + 25);
int port = 0x0000FFFF & (unsigned short)*ptr;

答案 3 :(得分:0)

你也可以这样做....例如iam显示为......这里我采取了无符号缓冲区你可以根据你的要求修改它...

     unsigned char upBuff[3] = {0};
     upBuff[1] = att_seq_no & 0xff;
     upBuff[0] = att_seq_no >> 8;
     printf("Updated Sequence Number(For Attendance Record Table)(IN HEXA)\
                     Now is(IN HEXA) : %02x %02x\n", upBuff[0], upBuff[1]);