是否有内置方法来确保 C++ 流中多字节类型的字节序?特别是,我想使用read()
和write()
从流中读取/写入小型字符数组。我需要确保这些将始终以小端格式存储。(是的,我可以一次做一个字节,也可以使用移位等,但这不是我的问题。)
问问题
1199 次
5 回答
1
对于 char 数组,您无需担心字节顺序,因为每个字符都是一个字节。如果您将整数之类的东西编码为一系列字节,那么您的流需要读取和写入的不是 char 数组,而是类型化数组,以便您知道自己在处理什么。也就是说,当您将整数转换为字节时,您已经丢失了恢复字节顺序所需的信息。
于 2012-06-22T15:36:07.147 回答
0
没有办法保证这一点。我很确定这是由架构决定的,而不是编译器。不过,有一些方法可以检查字节顺序。
在您的特定情况下,并没有真正的担心,因为据我所知,C++ 的每个严肃实现都将char
s 存储为单个字节。
于 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 回答