首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在两个字节的char数组中存储16位数字?

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

Stack Overflow用户
提问于 2011-11-30 21:53:32
回答 4查看 5.7K关注 0票数 2

我需要将端口号存储在char数组中,以便可以将其写入套接字。该协议指定字节25和26用于端口号。我已经尝试了很多方法,但我现在可以用下面的方法来存储数字:

代码语言:javascript
复制
//msg is declared as char msg[50];
msg[25] = (uint8_t) (UDP_PORT / 256);
msg[26] = (uint8_t) (UDP_PORT % 256);

然后,为了恢复套接字另一端的数字,我有:

代码语言:javascript
复制
uint8_t msb, lsb;
msb = msg[25];
lsb = msg[26];
int port =  msb * 256 + lsb;

任何建议都将不胜感激。

EN

回答 4

Stack Overflow用户

发布于 2011-11-30 22:06:43

你有没有尝试过,shift,and,or运算?

代码语言:javascript
复制
msg[25] = (uint8_t) ((UDP_PORT >> 8) & 0xff);
msg[26] = (uint8_t) (UDP_PORT & 0xff);

然后

代码语言:javascript
复制
uint8_t msb, lsb;
msb = msg[25];
lsb = msg[26];
int port =  (msb << 8) | lsb;

您确定UDP_PORT是16位的值吗?...because如果它是32位的,则分区将无法隔离msb。当然,逐位操作将会。

票数 1
EN

Stack Overflow用户

发布于 2011-12-01 10:00:05

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

发送:

代码语言:javascript
复制
uint16_t *ptr = (uint16_t*) &msg[25];
*ptr = htons(UDP_PORT);

接收:

代码语言:javascript
复制
uint16_t *ptr = (uint16_t*) &msg[25]; 
int port = ntohs(*ptr); 
票数 1
EN

Stack Overflow用户

发布于 2011-11-30 22:50:54

也许这就是你想要的:

代码语言:javascript
复制
/* 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);

然后:

代码语言:javascript
复制
/* if msg is a address variable */ 
unsigned short *ptr = (unsigned short *)(msg + 25);
int port = 0x0000FFFF & (unsigned short)*ptr;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8327012

复制
相关文章

相似问题

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