2013-02-10 51 views
1

我想讀取存儲爲char數組中特定二進制格式的浮點數。的格式如下所示,其中每個字母表示一個二進制數字:閱讀在字符數組中以二進制格式存儲的double

SEEEEEEE MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM 

格式在此website更清楚的解釋。基本上,指數是超過-64的符號,尾數被標準化爲值< 1和> 1/16。爲了得到數字的真實值,尾數與指數真值的冪相乘16倍。

基本上,我到目前爲止所做的是提取符號和指數值,但我無法提取尾數。我正在嘗試的實現非常蠻力,在代碼方面可能遠非理想,但在我看來,它是最簡單的。它basicly是:

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

它採用存儲在所述字符陣列中的每個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; 

這裏怎麼回事?另外,我很想知道如何實現這樣的轉換最理想?

+2

這就像過去兩天中關於完全相同的事情的第十個問題。這是否是某種家庭作業的最後期限?你的教授是否知道你正在就這個問題尋求答案? – 2013-02-10 15:22:47

+0

不幸的是,我還沒有看到以前的問題,但我做過搜索,如果之前有任何類似的問題。如果你必須知道,這個上下文是關於讀取GDSII格式文件(主要存儲IC佈局的文件格式)。更多信息請參考:(http://boolean.klaasholwerda.nl/interface/bnf/gdsformat.html )另外,沒有任何教授參與其中。 – cgurleyuk 2013-02-10 15:25:03

+0

不夠公平,並且對於暗示道歉。 – 2013-02-10 15:30:30

回答

1

我還沒有試過運行你的代碼,但我懷疑你這樣做的原因:

0x27f4c18f5c27f6 

,而不是

0x28f5c28f5c28f6 

是因爲你必須在一個單元格「負數」在它之前。您的8位字節數組是有符號還是無符號值?我希望如果你使它無符號的話它會更好。 [或者移動你的演員陣容,以便在換班之前]。

+0

我的字節數組是一個char *,所以它被簽名,但我認爲我正在執行轉換操作之前的投射。上面的代碼沒有這樣做嗎? – cgurleyuk 2013-02-10 15:59:35

+0

我會在「添加」之前打印中間值[我個人會在值中使用'|',因爲如果添加負值等,可以節省任何不需要的「借用」]。 – 2013-02-10 16:05:26

+0

這似乎是問題所在,'static_cast (0xf3)'(0xf3實際上是一個存儲在char *數組中的值)導致了'0xfffffffffffffff3',這當然不是我想要的。將表達式更正爲'static_cast (0xf3)&0xff'似乎解決了這個問題,但我不明白的是,如果這是預期的行爲? – cgurleyuk 2013-02-10 16:21:03

相關問題