0

是否有内置方法来确保 C++ 流中多字节类型的字节序?特别是,我想使用read()write()从流中读取/写入小型字符数组。我需要确保这些将始终以小端格式存储。(是的,我可以一次做一个字节,也可以使用移位等,但这不是我的问题。)

4

5 回答 5

1

对于 char 数组,您无需担心字节顺序,因为每个字符都是一个字节。如果您将整数之类的东西编码为一系列字节,那么您的流需要读取和写入的不是 char 数组,而是类型化数组,以便您知道自己在处理什么。也就是说,当您将整数转换为字节时,您已经丢失了恢复字节顺序所需的信息。

于 2012-06-22T15:36:07.147 回答
0

没有办法保证这一点。我很确定这是由架构决定的,而不是编译器。不过,有一些方法可以检查字节顺序。

在您的特定情况下,并没有真正的担心,因为据我所知,C++ 的每个严肃实现都将chars 存储为单个字节。

于 2012-06-22T15:37:45.927 回答
0

由于没有班次就没有办法做到这一点——当你使用它时,架构会强制你在内存中按一定的顺序排列它们——最简单的解决方法是使用字节顺序标记。如果这是不可接受的,恐怕你必须使用轮班。

为了检查您的假设是否正确,您可以说类似

static_assert(sizeof(char) == 1, "Chars are not one byte!!!!????");
于 2012-06-22T15:46:04.003 回答
0

对于字符数组,“其他人所说的”。

对于更复杂的数据类型,不要自己动手,而是看看现有的序列化项目。在撰写本文时,google 的 protobuf 似乎不是一个糟糕的选择。

于 2012-06-22T15:50:50.777 回答
0

此功能可以简单地检查系统的字节顺序:

void print_endianness() {
    union {
        unsigned int i;
        char c[4];
    } un;
    un.i = 0x12345678;

    if (un.c[0] == 0x78 && un.c[3] == 0x12)
        printf("little-endian\n");
    else if (un.c[0] == 0x12 && un.c[3] == 0x78)
        printf("big-endian\n");
    else
        printf("unknown\n");
}
于 2017-02-20T09:37:50.600 回答