可变长度数据和零长度数组的二进制序列化,是否安全
Binary serialization of variable length data and zero length arrays, is it safe?
我做了一些研究,但找不到明确的批准或反对。
我想要的是,一个固定大小的结构+可变长度的部分,这样序列化就可以以简单且不易出错的方式表达。
struct serialized_data
{
int len;
int type;
char variable_length_text[0];
};
然后:
serialize_data buff = (serialize_data*)malloc(sizeof(serialize_data)+5);
buff->len=5;
buff->type=1;
memcpy(buff->variable_length_text, "abcd", 5);
不幸的是,我找不到MSVC,GCC,CLang等是否可以接受它。
也许有更好的方法来实现相同的目标?
我真的不希望周围到处都是那些丑陋的演员:
memcpy((char*)(((char*)buffer)+sizeof(serialize_data)), "abcd", 5);
该程序使用零长度数组。这不是C,而是GNU扩展。
http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
C89 中一个常见的习语,称为结构体黑客,是使用:
struct serialized_data
{
int len;
int type;
char variable_length_text[1];
};
不幸的是,它作为灵活阵列的常见用途并不严格符合要求。
C99带有类似的东西来执行相同的任务:一种称为灵活阵列成员的功能。这是标准(C99,6.7.2.1p17)中的一个例子
struct s { int n; double d[]; };
int m = 12; // some value
struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));
相关文章:
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- 在处理网络、二进制数据和序列化时应使用流或容器
- 大多数基本类型的高效二进制序列化
- C++ 从 Boost object_pool构造的指针的 Boost 二进制序列化
- 如何使用自定义对象的序列化在 c++ 中编写自定义二进制文件处理程序
- 在为视频游戏实施基本的二进制序列化时,请担心可移植性
- 序列化 std::shared_ptr<> 传入和序列化出二进制流
- 二进制要找到什么类型的序列化
- 使用提升序列化读取具有批大小的二进制文件
- static_assert 在使用 boost 反序列化二进制数据时失败"typex::value"失败
- 提升序列化在从二进制文件读取时引发异常
- Z3 C++ API 产生"unknown",而序列化输出上的二进制生成"unsat"
- C++ 如何通过套接字 (TCP) 进行二进制序列化
- 用C++序列化二进制数据的正确方法
- 浮动点号的二进制序列化(仅限于IPC)
- 使用 fwrite/fread 对矩阵进行二进制(反)序列化不起作用
- 脚本到二进制转换和对象序列化
- Boost序列化二进制存档给出错误的输出
- 在 boost 中序列化二进制数据失败,并出现"签名无效"错误
- 使用ifstream和ofstream序列化二进制数据时出现问题