c - 用 C 序列化 double 和 float

标签 c serialization floating-point

如何在 C 中序列化 double 和 float ?

我有以下用于序列化 shorts、ints 和 chars 的代码。

unsigned char * serialize_char(unsigned char *buffer, char value)
{
    buffer[0] = value;
    return buffer + 1;
}

unsigned char * serialize_int(unsigned char *buffer, int value)
{
    buffer[0] = value >> 24;
    buffer[1] = value >> 16;
    buffer[2] = value >> 8;
    buffer[3] = value;
    return buffer + 4;
}

unsigned char * serialize_short(unsigned char *buffer, short value)
{
    buffer[0] = value >> 8;
    buffer[1] = value;
    return buffer + 2;
}

编辑:

我从 this question 中找到了这些函数

编辑 2:

序列化的目的是将数据发送到UDP套接字,并保证即使字节顺序不同也可以在另一台机器上反序列化。考虑到我必须序列化 int、double、float 和 char*,是否有任何其他“最佳实践”来执行此功能?

最佳答案

可移植的方式:使用frexp序列化(转换为整数尾数和指数)和ldexp反序列化。

简单的方法:假设在 2010 年你关心的任何机器都使用 IEEE float,声明一个包含 float 元素和 uint32_t 元素的 union ,并使用你的整数序列化序列化 float 的代码。

讨厌二进制文件的方式:将所有内容序列化为文本,包括 float 。使用 "%a" printf 格式说明符来获取一个十六进制 float ,它始终被精确表示(前提是您不使用类似 "%.4a" 的内容限制精度) >) 且不受舍入误差的影响。您可以使用 strtod 或任何 scanf 函数系列读回这些内容。

关于c - 用 C 序列化 double 和 float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3418319/

相关文章:

java - 了解序列化代理

.net - 为什么我的 .Net 对象不能序列化?

c - 如何在 C 中为文件扩展名定义 ".txt"常量?

c - 为什么 sendfile 不检查从输入描述符读取是否会阻塞?

php - 将 PHP 数组数据保存到 mysql 表的最佳方法

c++ - 避免输出负零的最佳方法是什么?

testing - 如何将 'checksum' 噪声 float 数组?

c - 使用 distcc 编译失败,但不使用它也可以

c 二进制文件读取问题

python - 非常奇怪的 numpy 数组浮点行为