确保 c++ 流中的字节序
Ensuring endianness in c++ streams
有没有内置的方法可以确保C++流中多字节类型的字节序?特别是,我想使用 read()
和 write()
向/从流中读取/写入小字符数组。我需要确保这些将始终以小端格式存储。(是的,我可以一次做一个字节或使用移位等,但这不是我的问题。
对于字符数组,您无需担心字节序,因为每个字符都是一个字节。如果要将整数之类的内容编码为一系列字节,则流不需要作为 char 数组进行读写,而是作为类型化数组进行读写,以便您知道自己在处理什么。也就是说,当您将整数转换为字节时,您已经丢失了恢复字节序所需的信息。
没有办法保证这一点。我很确定无论如何,这是由架构而不是编译器决定的。不过,有一些方法可以检查字节序。
在您的特定情况下,并没有真正的担忧,因为据我所知,C++存储的每个严肃实现都char
为单个字节。
由于没有
移位就无法做到这一点 - 当您使用它时,该架构会强制您在内存中按特定顺序排列它们 - 最简单的解决方法是使用字节顺序标记。 如果这是不可接受的,恐怕你必须使用轮班。
为了检查你的假设是否正确,你可以说这样的话
static_assert(sizeof(char) == 1, "Chars are not one byte!!!!????");
对于字符数组,"其他人说了什么"。
对于更复杂的数据类型,与其滚动自己的数据类型,不如查看现有的序列化项目。在撰写本文时,谷歌的protobuf似乎不是一个糟糕的选择。
此函数可以简单地检查系统的字节序:
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-endiann");
else if (un.c[0] == 0x12 && un.c[3] == 0x78)
printf("big-endiann");
else
printf("unknownn");
}
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 当比特(而不是字节)的顺序至关重要时的持久性
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 如何在文件中查找字节序列
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 字节到位运算符重载C++
- 在java中读取c++字节的位字段
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 字节真的是最小可寻址单元吗
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 如何将原始字节附加到 std::vector?
- 基于字节数组生成静态范围整数值