C/C++ 中的跨平台自定义文件头
Cross Platform Custom File Header in C/C++
我目前正在处理一个加密文件并将其添加到应用程序库中的项目。我需要对文件格式进行版本控制,以便我计划在加密文件前面附加一个文件头。该项目在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,并在成员变量中获取详细信息。
我的问题是
- 有没有更好的方法?
- 在平台差异的情况下,将长Header_v1写入文件是否有任何问题?
- 在具有来自其他平台的文件的所有设备中,逻辑应以相同的方式工作。这能持续吗?
您
最终可能会在代码中出现很多#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
只是感觉不对劲。通常这些字段应该一个接一个地出现,但是通过并集,它们都会相互重叠,从同一位置开始。
相关文章:
- 告诉CMake链接到自定义文件夹中的Boost
- 通过cMake使用具有自定义文件扩展名的共享库
- 威纳派读取自定义文件或文件夹的所有访问权限
- 使用命令列表解析自定义文件
- Qt解析自定义文件格式
- FAT32和NTF中的自定义文件属性
- 如何在没有"fatal error: Wt/WApplication: No such file or directory"的情况下将wt安装到自定义文件夹中
- C++ while 循环在自定义文件结构中
- QT C 读取自定义文件结构
- C/C++ 中的跨平台自定义文件头
- 自定义文件类中fstream对象的生存期
- 如何使用BinaryReader类使用C#读取自定义文件(C++)
- 提供带有libjpeg的自定义文件IO
- 如何在C++程序中包含自定义文件
- 使用scons构建自定义文件
- 具有桌面.ini和即时刷新功能的自定义文件夹图标
- 如何从文件文件夹创建自定义文件类型
- 将syslog设施日志重定向到自定义文件
- 如何在vc++ 2010中创建自定义文件模板
- 如何为自定义文件格式构建筛选器处理程序,以便可以通过windows搜索来搜索其内容