C/C++ 中的跨平台自定义文件头

Cross Platform Custom File Header in C/C++

本文关键字:自定义 文件 跨平台 C++      更新时间:2023-10-16

我目前正在处理一个加密文件并将其添加到应用程序库中的项目。我需要对文件格式进行版本控制,以便我计划在加密文件前面附加一个文件头。该项目在Qt中,目前适用于Windows。稍后还将为Android和Mac制作应用程序。

为此,我制作了这些结构,即版本 1 文件。

struct Header_Meta
{
    char signature [4];
    char version [4];
};
struct Header_v1
{
    char id [12];
    char flag [8];
    char name [128];
    long size;
};
union File_v1
{
    Header_Meta meta;
    Header_v1 header;
    byte null [512 - sizeof (Header_Meta) - sizeof (Header_v1)];
    byte data [MAX_HEADERv1];
};

该文件是二进制文件。现在在 getDetails(( 函数中,我将读取 MAX_HEADERv1 个字节到 file_v1.data,并在成员变量中获取详细信息。

我的问题是

  1. 有没有更好的方法?
  2. 在平台差异的情况下,将长Header_v1写入文件是否有任何问题?
  3. 在具有来自其他平台的文件的所有设备中,逻辑应以相同的方式工作。这能持续吗?

最终可能会在代码中出现很多#ifdef BIG/LITTLE_ENDIAN,具体取决于您尝试部署产品的平台。我会使用这样的long sizeunsigned char size[8](这将产生 64 (=8*8( 位值(,然后您可以在代码中使用公式,例如:

uint64_t real_size = size[0] + size[1] << 8 + size[2] << 16 + ....

在计算单个size字节时,您可以这样做:

size[0] = real_size && 0xFF;
size[1] = (real_size && 0xFF00) >> 8;
size[2] = (real_size && 0xFF0000) >> 16;

等等...

从这一点开始,您只需要担心将size字节正确写出到相应的位置。

关于要添加到标头(char version[4](的版本字符串,这完全取决于您要在那里存储什么。如果你想放置文本信息(例如:"v1.0"(,你将限制你可以拥有的可能版本,所以我建议再次放入二进制版本,例如:

version[0] = VERSION      // customers usually pay for an increase in this
version[1] = RELEASE      // new functionality, it's up to you if customer pays or not :)
version[2] = MAINTENANCE  // planned maintenance, usually customers don't pay for this
version[3] = PATCH        // emergency patch, hopefully you never have to use this

这将允许版本号以VERSION.RELEASE.MAINTENACE.PATCH的形式出现,您可以达到255.255.255.255

另外,请注意@Ben的评论,union只是感觉不对劲。通常这些字段应该一个接一个地出现,但是通过并集,它们都会相互重叠,从同一位置开始。