python2.7 将二进制有符号 double 转换为 ASCII 的难度

标签 python binary double ascii paradox

这可能听起来像是一个愚蠢的问题,但我找不到出路。我需要读取 paradox 文件 (.DB) 并将其转换为传统的 .CSV 文件。我找到了一个不错的模块( https://gist.github.com/BertrandBordage/9892556 ),它可以做到这一点......但是,有符号 double 的某些转换未正确完成。这很奇怪,因为如果我用 paradox 打开一个 DB 文件,并将其与相应的 .csv 中转换的内容进行比较,我可以看到:2、-2 或 2.00 将从二进制文件中正确读取,但 -2.00 不会。所有内容均以 8 位 double 形式从二进制文件中读取。

我几乎确定上面引用的模块可以正确读取所有列,但例如当我期望 [63, 180, 255, 255, 255, 255, 255, 255] 为 -54.00 (真正的悖论值)时,模块转换为-0.08203125。

所以我愚蠢的问题是: [63, 180, 255, 255, 255, 255, 255, 255] 是否可以转换为 -54.00?

谢谢

最佳答案

在 Borland BDE (.DB) 表中,在 Number (N) 类型列中,值 [63, 180, 255, 255, 255, 255, 255, 255] (0x 3FB4 FFFF FFFF FFFF) 确实是等于-54.00。任何其他解释都是不正确的。

BDE 将其数字 (N) 类型编码为 64 位浮点值,带有符号位、11 位指数和 53 位小数。 (我知道,总共有 65 位。​​继续阅读。)指数被编码为超过 1024 的整数,因此 0 的指数被编码为 0x400。该分数被标准化为没有前导零,并根据需要调整指数。分数的高位不被存储,因为它始终为 1。这将分数存储要求减少到 52 位。

对于正值,符号位设置为 1。对于负值,形成绝对值,符号位设置为 1,并对整个 64 位求补。

零被编码为 [128, 0, 0, 0, 0, 0, 0, 0] (0x 8000 0000 0000 0000)。

此编码将整个浮点值范围单调映射到无符号 64 位整数,从而允许非常快速地比较和排序 Number 类型值,而无需解释或解码它们。 (BDE 通常使用零符号位表示负值,使用 1 表示正值,因此它可以通过简单地连接字段值并随后忽略字段边界来形成复合索引。)

关于python2.7 将二进制有符号 double 转换为 ASCII 的难度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27360892/

相关文章:

python - 使用 Python 在许多文档中搜索许多表达式

java - 什么类型最适合在 Java 中管理二进制数据?

c - 直接以二进制执行计算机指令

printf 中 double 的正确格式说明符

java - C 中的 eval 函数结果为负

Python Azure Function 部署(Oryx 构建)在 "Running pip install..."步骤上挂起

python - Google App Engine 中的 UnicodeDecodeError

python - Conda 表示在 Python 3.5.1 中安装 dateutil 存在冲突

无法关闭 C 中的二进制文件

java - 可以在 BigDecimal 上下文中准确地使用用小整数值初始化的 double 吗?