hex - 将 double 解释为十六进制
问题描述
我正在通过打印来自 C# 表示的原始字节来处理存储在文件中的双精度数(64 位)。例如十进制数 0.95238095238095233 以十六进制存储为字节“9e e7 79 9e e7 79 ee 3f”。一切都按预期工作,我可以写作和阅读,但我希望自己能够理解这种双重表现。
根据 C# 文档https://docs.microsoft.com/en-us/dotnet/api/system.double?view=netframework-4.7.2#explicit-interface-implementations和维基百科https://en.wikipedia。 org/wiki/Double-precision_floating-point_format第一位应该是符号,0 表示正数,1 表示负数。但是,无论我从哪个方向读取字节,第一位都是 1。9 = 1001 或 f = 1111。我很困惑,因为 0.95... 是正数。
作为仔细检查,以下 python 代码也返回正确的十进制数。
unpack('d', binascii.unhexlify("9ee7799ee779ee3f"))
谁能解释人类如何读取这些字节并到达 0.95238095238095233?
解决方案
想通了,字节的集合被读取为 64 位数字(左侧的第一位),但每个字节都像字符串一样读取(右侧的第一位)。所以我的字节应该首先读取“3F”,3F 从左到右读取,所以我从 0011 1111 等位开始。这给出了预期的 IEEE 754 编码:第一位是符号,接下来的 11 位是指数,然后是分数。
推荐阅读
- python - paramiko.SSHClient.exec_command 挂起
- c# - 带有 WebRootPath 的图像路径不起作用。IHosting环境
- haskell - 为什么每个haskell 类型都被提升(即被_|_ 占用)?
- tensorflow - 多元 LSTM 未正确训练
- python - 从python中的文件读取时如何将字符串读取为整数
- character-encoding - 如何绕过“注入XSS有效载荷?
- android - 为什么 ToolbarPlacement 在 xaml 中不再起作用
- android - 问题:违反干扰应用、第三方广告或设备功能政策
- java - 将 DATE 插入 MYSQL 数据库。将值从 Android 发布到 PHP
- php - 我得到 mysqli 错误 1064 但我不知道为什么