【问题标题】:Cross Platform Custom File Header in C/C++C/C++ 中的跨平台自定义文件头
【发布时间】:2016-05-06 21:44:01
【问题描述】:

我目前正在开发一个加密文件并将它们添加到应用程序库中的项目。我需要对文件格式进行版本化,以便我计划在加密文件中添加文件头。该项目在 Qt 中,目前用于 Windows。以后也会为android和mac做app。

为此,我制作了这些结构,即版本 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. 逻辑应该在所有设备中以相同的方式工作,文件来自另一个平台。这会成立吗?

【问题讨论】:

  • 在不同平台上会有数据类型大小的问题吗?由于您正在将长值写入文件...
  • 您还必须注意字节顺序。
  • 不要忘记字段对齐 (#pragma pack)。不要忘记字节顺序。
  • 字段对齐?这是什么?
  • 您确定要使用union 作为您的File_v1 数据类型吗?所有成员都将存储在同一个内存位置。

标签: c++ c qt file cross-platform


【解决方案1】:

根据您尝试部署产品的平台,您最终可能会在代码中包含大量#ifdef BIG/LITTLE_ENDIAN。我会将long size 用作:unsigned 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 感觉不对。通常这些字段应该一个接一个地出现,但是通过联合,它们都将相互重叠,从同一个位置开始。

【讨论】:

  • 是否有更好的文件版本控制和添加标题的方法?
  • 始终使用htonll() 以网络(大端)字节顺序将uint64_t 存储在文件中并始终使用ntohll() 读取它会容易得多。是的,联合领域肯定感觉不对。
猜你喜欢
  • 2013-11-03
  • 2011-04-14
  • 1970-01-01
  • 2011-07-31
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
相关资源
最近更新 更多