python2.7难以将二进制有符号双精度转换为ASCII

2024-10-03 02:34:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

所以我愚蠢的问题是:【63,180,255,255,255,255,255,255】可以转换成-54.00吗?在

谢谢


Tags: 模块文件csvhttpsgithubcomdb二进制
2条回答

我还必须从Python中读取Paradox(.db)文件,但是您链接到的BertrandBordage的解决方案(也)对我不起作用。{1}开发Python库^完成更多绑定

通过安装

pip install pypxlib

例如,您可以:

^{pr2}$

在Borland-BDE(.DB)表中,在数字(N)类型列中,值[63,180,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](0x 8000 0000 0000 0000)。在

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

相关问题 更多 >