short int 到 unsigned int 转换网络字节顺序 C++
Posted
技术标签:
【中文标题】short int 到 unsigned int 转换网络字节顺序 C++【英文标题】:short int to unsigned int conversion network byte order C++ 【发布时间】:2013-08-16 14:45:50 【问题描述】:我有一个两字节短整型指针数组short int* hostdata
,并希望将其转换为网络字节顺序为unsigned int* net_data
的四字节无符号整型。我这样写可以吗:
for(int i = 0; i < numsamples; ++i)
net_data[i] = htonl((unsigned int)hostdata[i]);
或者我应该像这样使用 reinterpret_cast 来做:
for(int i = 0; i < numsamples; ++i)
net_data[i] = htonl(reinterpret_cast<unsigned int *>(reinterpret_cast<short int*>hostdata[i]));
【问题讨论】:
您的 2 个代码示例似乎并不等同于我,因为您在没有取消引用的情况下在第二个示例中转换为指针 - 有意?另外,您想实现哪种转换? short int 可以有负数, unsigned int 不能 - 在这种情况下你会更喜欢下溢吗?截断?重新诠释? 你想对负值做什么? 您有指针数组short int *hostdata[SIZE]
,还是数字数组short int hostdata[SIZE]
?如果是后者,你想用负数做什么?
@Joni 根据他的编辑,他没有 - 只是一个指向 short int 的指针(指针和数组不相同)
@griffin "short int pointer array" 听起来仍然很像指向short int
的指针数组。第二个示例仍然将数组值解释为指针。
【参考方案1】:
如果您使用的是short integers
,那么既然可以使用htons
,为什么还要使用htonl
。
htonl 代表主机到网络长
htons 代表主机到网络短
请记住,几乎所有 h,n,l,s 的组合都存在,除了像 stonhl
这样愚蠢的组合
不要使事情过于复杂,将它们添加到结构中并按原样发送。
struct MsgHead
unsigned short utype;
unsigned short usize;
;
// 8 bytes, no padding will be added by the compiler
struct MyPacket
// Header (optional)
MsgHead head; // 4 bytes
unsigned short myData[2]; // 4 bytes
;
【讨论】:
实际上我正在尝试将 2 字节格式数据(短整数)存储为 4 字节格式(整数)。我不应该使用 htonl 吗? @AvbAvb 使用struct
保存short
s 和htons
将它们转换为网络顺序。以上是关于short int 到 unsigned int 转换网络字节顺序 C++的主要内容,如果未能解决你的问题,请参考以下文章
unsigned short int 和 unsigned int 或 unsigned short 有啥区别?
unsigned short int 与 unsigned int 有何不同
char,short ,int ,long,long long,unsigned long long数据范围
char,short ,int ,long,long long,unsigned long long数据范围