C++ 在不同的Endian上写入/读取二进制文件

C++ 在不同的Endian上写入/读取二进制文件,c++,c,C++,C,一个相当简单的问题是,如何安全地将常量大小结构(包含uint8\u t、uint32\u t等)写入二进制文件,以确保其可读性 是否接受使用#pragma pack?(类似于BITMAPFILEHEADER),然后将整个结构写入文件(到目前为止,它可用于位图)。 我是否应该使用简单的单字节序列化(如图所示) endianness呢?一个人应该如何准备切换到另一个?是否仅强制eg little endian并要求应用程序(在BE中)按字节交换每个元素 我目前的项目相当简单,但我想在将来扩展它,所以

一个相当简单的问题是,如何安全地将常量大小结构(包含uint8\u t、uint32\u t等)写入二进制文件,以确保其可读性

  • 是否接受使用
    #pragma pack
    ?(类似于
    BITMAPFILEHEADER
    ),然后将整个结构写入文件(到目前为止,它可用于位图)。 我是否应该使用简单的单字节序列化(如图所示)

  • endianness呢?一个人应该如何准备切换到另一个?是否仅强制eg little endian并要求应用程序(在BE中)按字节交换每个元素

  • 我目前的项目相当简单,但我想在将来扩展它,所以我宁愿尝试避免任何陷阱。 我知道boost提供了序列化,但我想手动处理

    是否接受使用#pragma pack

    这是我不赞成的。打包结构将违反数据对齐要求。在某些体系结构上,未对齐的访问只是速度较慢,而在另一些体系结构上则完全禁止。在后一种情况下,编译器被迫生成代码,在每次访问数据成员时,这些代码将从字节中重新组装数据成员

    您应该编写自定义序列化代码,而不是结构打包。也就是说,像平常一样设计类,使用封装之类的东西,然后只提供序列化/反序列化方法

    endianness呢?一个人应该如何准备切换到另一个?是否仅强制eg little endian并要求应用程序(在BE中)按字节交换每个元素

    这是完全可以接受的,事实上被广泛使用。另一种方法是将endiannes编码为数据格式本身,这是一个坏主意,因为它会毫无理由地使代码复杂化。在进行I/O时,字节交换无论如何都不会成为性能瓶颈

    是否接受使用#pragma pack

    这是我不赞成的。打包结构将违反数据对齐要求。在某些体系结构上,未对齐的访问只是速度较慢,而在另一些体系结构上则完全禁止。在后一种情况下,编译器被迫生成代码,在每次访问数据成员时,这些代码将从字节中重新组装数据成员

    您应该编写自定义序列化代码,而不是结构打包。也就是说,像平常一样设计类,使用封装之类的东西,然后只提供序列化/反序列化方法

    endianness呢?一个人应该如何准备切换到另一个?是否仅强制eg little endian并要求应用程序(在BE中)按字节交换每个元素


    这是完全可以接受的,事实上被广泛使用。另一种方法是将endiannes编码为数据格式本身,这是一个坏主意,因为它会毫无理由地使代码复杂化。在进行I/O时,字节交换无论如何不会成为性能瓶颈。

    一种方法是像Unicode一样,显式地在数据中包含endian信息。毕竟只有1位:)这使得解码方面更容易,只要你理解这一点。在我写一个长答案之前,让我问一下这个问题。为什么您不想用适当的库用XML或JSON编写数据呢?二进制文件格式通常更难调试,并且存在您提到的所有关于尾端和打包的问题。文本文件格式,如XML和JSON,没有这些问题。嗨,selbie,目前我们正在为uni做一个小项目,它要求我们将压缩数据存储为二进制文件(这就是问题所在)。该项目的目的基本上归结为在二进制文件中对数据进行排序,然后将其转换为可以表示不同文件(如PNG、BMP等)的不同文件,以
    “MM”
    “II”
    开始,以表示endian属性。文件通常是以代码的本机端号编写的,而读取文件则必须按照指定的端号进行读取。endian有很多解决方案。值得思考的是:。一种方法是像Unicode一样,显式地在数据中包含endian信息。毕竟只有1位:)这使得解码方面更容易,只要你理解这一点。在我写一个长答案之前,让我问一下这个问题。为什么您不想用适当的库用XML或JSON编写数据呢?二进制文件格式通常更难调试,并且存在您提到的所有关于尾端和打包的问题。文本文件格式,如XML和JSON,没有这些问题。嗨,selbie,目前我们正在为uni做一个小项目,它要求我们将压缩数据存储为二进制文件(这就是问题所在)。该项目的目的基本上归结为在二进制文件中对数据进行排序,然后将其转换为可以表示不同文件(如PNG、BMP等)的不同文件,以
    “MM”
    “II”
    开始,以表示endian属性。文件通常是以代码的本机端号编写的,而读取文件则必须按照指定的端号进行读取。endian有很多解决方案。一些值得思考的东西:。