LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 232|回复: 0

打包与解包函数

[复制链接]
发表于 2024-1-26 17:52:52 | 显示全部楼层 |阅读模式


打包与解包函数提供了独立于平台的高效方式来将浮点数值存储为字节串。 Pack 例程根据 C double 产生字节串,而 Unpack 例程根据这样的字节串产生 C double。 后缀 (2, 4 or 8) 指明字节串中的字节数。

在明显使用 IEEE 754 格式的平台上这些函数是通过拷贝比特位来实现的。 在其他平台上,2 字节格式与 IEEE 754 binary16 半精度格式相同,4 字节格式 (32 位) 与 IEEE 754 binary32 单精度格式相同,而 8 字节格式则与 IEEE 754 双精度格式相同,不过 INF 和 NaN (如果平台存在这两种值) 未得到正确处理,而试图对包含 IEEE INF 或 NaN 的字节串执行解包将会引发一个异常。

在具有比 IEEE 754 所支持的更高精度,或更大动态范围的非 IEEE 平台上,不是所有的值都能被打包;在具有更低精度,或更小动态范围的非 IEEE 平台上,则不是所有的值都能被解包。 在这种情况下发生的事情有一部分将是偶然的(无奈)。

在 3.11 版本加入.

打包函数
打包例程会写入 2, 4 或 8 个字节,从 p 开始。 le 是一个 int 参数,如果你想要字节串为小端序格式 (指数部分放在后面,位于 p+1, p+3 或 p+6 p+7) 则其应为非零值,如果你想要大端序格式 (指数部分放在前面,位于 p) 则其应为零。 PY_BIG_ENDIAN 常量可被用于使用本机端序:在大端序处理器上等于 1,在小端序处理器上则等于 0。

返回值: 如果一切正常则为 0,如果出错则为 -1 (并会设置一个异常,最大可能为 OverflowError)。

在非 IEEE 平台上存在两个问题:

如果 x 为 NaN 或无穷大则此函数的行为是未定义的。

-0.0 和 +0.0 将产生相同的字节串。

int PyFloat_Pack2(double x, unsigned char *p, int le)
将 C double 打包为 IEEE 754 binary16 半精度格式。

int PyFloat_Pack4(double x, unsigned char *p, int le)
将 C double 打包为 IEEE 754 binary32 单精度格式。

int PyFloat_Pack8(double x, unsigned char *p, int le)
将 C double 打包为 IEEE 754 binary64 双精度格式。

解包函数
解包例程会读取 2, 4 或 8 个字节,从 p 开始。 le 是一个 int 参数,如果字节串为小端序格式 (指数部门放在后面,位于 p+1, p+3 或 p+6 和 p+7) 则其应为非零值,如果为大端序格式 (指数部分放在前面,位于 p) 则其应为零。 PY_BIG_ENDIAN 常量可被用于使用本机端序:在大端序处理器上等于 1,在小端序处理器上则等于 0。

返回值: 解包后的 double。 出错时,返回值为 -1.0 且 PyErr_Occurred() 为真值 (并且会设置一个异常,最大可能为 OverflowError)。

请注意在非 IEEE 平台上此函数将拒绝解包表示 NaN 或无穷大的字节串。

double PyFloat_Unpack2(const unsigned char *p, int le)
将 IEEE 754 binary16 半精度格式解包为 C double。

double PyFloat_Unpack4(const unsigned char *p, int le)
将 IEEE 754 binary32 单精度格式解包为 C double。

double PyFloat_Unpack8(const unsigned char *p, int le)
将 IEEE 754 binary64 双精度格式解包为 C double。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表