c++ - 读取以二进制格式存储在字符数组中的 double

标签 c++ floating-point binary

我正在尝试读取以特定二进制格式存储在 char 数组中的 float 。格式如下,每个字母代表一个二进制数字:

SEEEEEEE MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM

格式在 website 中解释得更清楚.基本上,指数采用 Excess-64 表示法,尾数标准化为值 <1 和 >1/16。要获得数字的真实值,将尾数乘以 16 的指数真实值的幂。

基本上,到目前为止我所做的是提取符号和指数值,但我在提取尾数时遇到了问题。我正在尝试的实现是相当蛮力的,在代码方面可能远非理想,但在我看来它是最简单的。它基本上是:

unsigned long a = 0;
for(int i = 0; i < 7; i++)
    a += static_cast<unsigned long>(m_bufRecord[index+1+i])<<((6-i)*8);

它获取存储在 char 数组中的每个 8 位字节大小,并根据它在数组中的索引将其左移。所以如果我的数组如下:

{0x3f, 0x28, 0xf5, 0xc2, 0x8f, 0x5c, 0x28, 0xf6}

我期望 a 取值:

0x28f5c28f5c28f6

但是,通过上述实现,a 取值:

0x27f4c18f5c27f6

稍后,我使用以下代码将长整数转换为 float :

double m = a;

m = m*(pow(16, e-14));
m = (s==1)?-m:m;

这里出了什么问题?另外,我很想知道如何理想地实现这样的转换?

最佳答案

我没有试过运行你的代码,但我怀疑你得到这个的原因:

0x27f4c18f5c27f6

代替

0x28f5c28f5c28f6

是因为您前面的单元格中有一个“负数”。您的 8 位字节数组是有符号值还是无符号值?如果您将其设为未签名,我希望它会更好用。 [或者移动你的石膏,使其在轮类操作之前]。

关于c++ - 读取以二进制格式存储在字符数组中的 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14799210/

相关文章:

java - JPA - 将 double 格式从 aaa、bbb 转换为 aaa.bbb

Python numpy float16 数据类型操作,和 float8?

swift - 二元运算符 '|' 不能应用于类型 'Int' 和 'UInt8' 的操作数

c++ - 可用的 Visual Studio 2008 c++ 项目平台的优缺点?

c++ - 需要在 VC6 和 VC7 中判断函数是否有 void 返回类型的方法

C++ 使用 ShellExecute 打开链接

c++ - 用于独立于平台的二进制文件 I/O 的 C/C++ 库

c++ - std::type_info::name() 的实际目的是什么?

c++ - double 的 printf 舍入行为

javascript - 神秘2 出现在我的JavaScript 十进制到二进制转换器的输出中?