2012-05-23 85 views
1

如何將C++中的正浮點數(ieee 754,單精度32位)轉換爲BCD?如何將float轉換爲BCD

UPDATE

如果我沒有錯,我需要的是所謂的壓縮BCD碼。我已經在對BCD轉換進行整頓了。在我做的方式,數量1234會導致以下字節數組中:

{0x00, 0x00, 0x12, 0x34} 

我使用(這可能是沒有這樣做的最好的方法)的方法是:

public byte[] ToBCD(long num) { 
    long bcd = 0; 
    int i = 0; 
    while (num > 9) { 
     bcd |= ((num % 10) << i); 
     num /= 10; 
     i += 4; 
    } 
    byte[] bytes = BitConverter.GetBytes(bcd | (num << i)); 
    Array.Reverse(bytes); 
    return bytes; 
} 
+0

BCD = [Binary-coded decimal](http://en.wikipedia.org/wiki/Binary-coded_decimal)? – dtb

+0

@dtb這是正確的 – Fernando

+0

似乎有辦法編碼一個值。你想要哪一個? – dtb

回答

0

不知道如何處理這個問題,但這裏是我發現:

自協議文檔很爛,我搜索了一些舊代碼,發現證據,即使其他數據被編碼爲BCD,浮點數不是。所以,BitConverter.GetBytes將會做我需要的。

3

BCD不是用來存儲浮點數的。但是,您可以使用您自己的自定義BCD類架構對其進行編碼和解碼。例如,我會拿你的號碼,並刪除小數點。然後我會像正常一樣將每個數字編碼爲BCD。然後添加一個額外的4位以確定小數點的位置。例如,編碼數15.101

15.101 -> 15101 - 去掉小數點

15101 -> 0001 0101 0001 0000 0001 - 轉換爲BCD

現在我們只是在結尾處添加一個額外的4位來確定小數位:

0001 0101 0001 0000 0001 -> 0001 0101 0001 0000 0001 0011

00113。這是因爲小數點在左邊3個位置。

就功能而言,只需選取最右邊的4位並保存以備後用。然後像平常一樣運行你的功能。然後將您保存的正確4位轉換爲十進制數。然後通過(10*number) ..thats把它

+0

沒有得到將浮動轉換爲bcd的問題。它假定你已經有了一個基數爲10的表示。它是你開始的。 – CogitoErgoCogitoSum