读取以二进制格式存储在字符数组中的双精度

Reading a double stored in a binary format in a character array

本文关键字:数组 双精度 字符 二进制 格式 存储 读取      更新时间:2023-10-16

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

SEEEEEEE MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM

本网站对格式进行了更清晰的解释。基本上,指数是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

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

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

这里出了什么问题?此外,我很想知道这样的转换在理想情况下是如何实现的?

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

0x27f4c18f5c27f6

而不是

0x28f5c28f5c28f6

是因为前面的单元格中有一个"负数"。您的8位字节数组是有符号值还是无符号值?我希望如果你让它不签名,它会更好地工作。[或者移动你的演员阵容,使其在轮班操作之前]。