C++ 数字的字节表示法

C++ 数字的字节表示法,c++,C++,我使用下一种方法在C++中获取数字的字节表示: template< class T > union u_value { T value; unsigned char bytes[ sizeof( T ) ]; } 模板 联合u_值 { T值; 无符号字符字节[sizeof(T)]; } 请告诉我这是真的吗?如果不是的话,为什么以及如何获得它?没有“真正”的方法。你所做的只是一种方法。一般来说,像这样的东西是不鼓励的,因为它通常会导致不可移植的代码。有时候,有很好的理由这

我使用下一种方法在C++中获取数字的字节表示:

template< class T >
union u_value
{
  T value;
  unsigned char bytes[  sizeof( T ) ];
}
模板
联合u_值
{
T值;
无符号字符字节[sizeof(T)];
}
请告诉我这是真的吗?如果不是的话,为什么以及如何获得它?

没有“真正”的方法。你所做的只是一种方法。一般来说,像这样的东西是不鼓励的,因为它通常会导致不可移植的代码。有时候,有很好的理由这样戳内部构件,但由于您没有告诉我们将如何处理“字节表示”,因此我们无法判断这种方法是否合适

编辑:所以网络是你的主题。在这种情况下,可以:

  • 您只传输POD类型(char、short、int等)。在本例中,您可能希望查看宏
    htons()
    htonl()
    ntohs()
    ntohl()
    ,它们确实承载网络字节顺序,反之亦然

  • 您正在传输复杂类型(例如类)。在本例中,您可能需要研究,因为这里要考虑的不仅仅是字节顺序

  • 无论采用哪种方式,最好使用现成的、有良好文档记录且易于理解的代码,而不是自己处理字节。

    没有“真正”的方法。你所做的只是一种方法。一般来说,像这样的东西是不鼓励的,因为它通常会导致不可移植的代码。有时候,有很好的理由这样戳内部构件,但由于您没有告诉我们将如何处理“字节表示”,因此我们无法判断这种方法是否合适

    编辑:所以网络是你的主题。在这种情况下,可以:

  • 您只传输POD类型(char、short、int等)。在本例中,您可能希望查看宏
    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