C++ 数字的字节表示法
我使用下一种方法在C++中获取数字的字节表示:C++ 数字的字节表示法,c++,C++,我使用下一种方法在C++中获取数字的字节表示: template< class T > union u_value { T value; unsigned char bytes[ sizeof( T ) ]; } 模板 联合u_值 { T值; 无符号字符字节[sizeof(T)]; } 请告诉我这是真的吗?如果不是的话,为什么以及如何获得它?没有“真正”的方法。你所做的只是一种方法。一般来说,像这样的东西是不鼓励的,因为它通常会导致不可移植的代码。有时候,有很好的理由这
template< class T >
union u_value
{
T value;
unsigned char bytes[ sizeof( T ) ];
}
模板
联合u_值
{
T值;
无符号字符字节[sizeof(T)];
}
请告诉我这是真的吗?如果不是的话,为什么以及如何获得它?没有“真正”的方法。你所做的只是一种方法。一般来说,像这样的东西是不鼓励的,因为它通常会导致不可移植的代码。有时候,有很好的理由这样戳内部构件,但由于您没有告诉我们将如何处理“字节表示”,因此我们无法判断这种方法是否合适
编辑:所以网络是你的主题。在这种情况下,可以:
htons()
,htonl()
,ntohs()
和ntohl()
,它们确实承载网络字节顺序,反之亦然htons()
,htonl()
,ntohs()
和ntohl()
,它们确实承载网络字节顺序,反之亦然无论采用哪种方式,建议使用现成的、有良好文档记录且易于理解的代码,而不是自己进行字节转换。不是真正的方式。这种方式是不可移植的,通常会导致未定义的行为。因为
virtual
函数额外空间未得到明显注意(如果T
是多态的)不是正确的方式。这种方式是不可移植的,通常会导致未定义的行为。因为
virtual
函数额外空间未得到明显注意(如果T
是多态的)如果要在网络上传输字节,则需要注意尾数如果要在网络上传输字节,则需要注意尾数这将起作用。下次反序列化时,请确保任何带有虚拟函数、指针等的内容都不准确。这将起作用。下次反序列化时,请确保任何带有虚拟函数、指针等的内容都不准确。Yeap,我知道,转换为big或little-endian很简单。Yeap,我知道,转换为big或little-endian很简单。我需要得到不同基本类型的字节数组。@emzar:一般来说,导线的另一侧可能不具有相同的表示形式。i、 e.
0x0、0x42
字节的一侧可以是0x0042
,另一侧可以是0x4200
。这就是为什么我们称之为不可移植。@MSalters:哦,我明白了,传输数组的端性是由协议描述的。如果有必要的话,我会转换它。如果Nessery的话,他们必须将数组转换成另一条线上的Endianne。@emzar:这就是问题之一。另一个问题是普通大小(一个int
?)有多大,还有一个问题是如何编码浮点类型。我可能忽略了更多。我需要得到不同基本类型的字节数组。@emzar:一般来说,线的另一端可能没有相同的表示形式。i、 e.0x0、0x42
字节的一侧可以是0x0042
,另一侧可以是0x4200
。这就是为什么我们称之为不可移植。@MSalters:哦,我明白了,传输数组的端性是由协议描述的。如果有必要的话,我会转换它。如果Nessery的话,他们必须将数组转换成另一条线上的Endianne。@emzar:这就是问题之一。另一个问题是普通大小(一个int
?)有多大,还有一个问题是如何编码浮点类型。可能是我忽略的更多。我只对眼底型使用它。我可以为{little,big}-endian系统编写可移植性的包装器。+1,不是正确的方式。一个小错误:将“可能导致未定义行为”更改为“未定义行为”。分配一个联合成员,然后检索另一个成员是未定义的行为。@David Hammen:我明白了,thx,但我在标准中找不到此信息。@emzar:“在联合中,最多一个数据成员可以在任何时候处于活动状态,也就是说,最多一个数据成员的值可以在任何时候存储在联合中。”您将u_值视为同时具有value成员和bytes成员。他们不是。C++中的联合使用包括设置特定成员,然后只检索特定成员。如果以后设置了其他成员,则应再次仅检索该特定成员。检索除最近分配的成员之外的其他成员是UB