難道字節得到了某種程度上洗牌?您描述的位的排列(字節2中的符號位,字節1中指數的LSB)與鏈接到的附錄O不同。它看起來像是交換了字節1和2。
我假定字節3和4也被交換,所以真正的十六進制值是43D4DB93。這將轉換爲二進制的0100 0011 1101 0100 1101 1011 1001 0011,所以符號位爲0,表示正數。指數是10000111(二進制)= 135(十進制),表示因子2 ^(135-128)= 128。最後,尾數是0.1101 0100 1101 1011 1001 0011(二進制),使用附錄O說你有在前面加0.1,即十進制大約爲0.8314。所以我的假設下你的數字是0.8314 * 128 = 106.4。
補充:一些Python 2代碼可能會澄清:
input = 0xD44393DB;
reshuffled = ((input & 0xFF00FF00) >> 8) | ((input & 0x00FF00FF) << 8);
signbit = (reshuffled & 0x80000000) >> 31;
exponent = ((reshuffled & 0x7F800000) >> 23) - 128;
mantissa = float((reshuffled & 0x007FFFFF) | 0x00800000)/2**24;
result = (-1)**signbit * mantissa * 2**exponent;
這就產生result = 106.42885589599609
。
下面是計算尾數線的解釋。首先,reshuffled & 0x007FFFFF
產生編碼尾數的23位:101 0100 1101 1011 1001 0011.然後... | 0x00800000
設置隱藏位,產生1101 0100 1101 1011 1001 0011。我們現在必須計算分數0.1101 0100 1101 1011 1001 0011。根據定義,這相當於1*2^(-1) + 1*2^(-2) + 0*2^(-3) + ... + 1*2^(-23) + 1*2^(-24)
。這也可以寫成(1*2^23 + 1*2^22 + 0*2^21 + ... + 1*2^1 + 1*2^0)/2^24
。括號中的表達式是1101 0100 1101 1011 1001 0011(二進制)的值,所以我們可以通過將(reshuffled & 0x007FFFFF) | 0x00800000
除以2^24來找到尾數。
我相信尾數也有不同的表示(IEEE格式有一個隱含的0.5)。我在家裏有一本LSI-11/02手冊 - 如果我今晚找到任何東西,我會發佈一個答案。 – 2009-11-25 16:19:57
無論您是否計數1023或1234,符號位必須位於結束字節中,字節2不能位於結尾。首先傳輸哪個字節,D4還是DB?更好的是,告訴我們每個字節的傳輸順序。你真的只有一個已知的價值? – 2009-11-26 11:24:14
收到的訂單是B1B2B3B4或實際的十六進制:D44393DB 要解析的訂單是B2B1B4B3,在本例中爲:43D4DB93,符號位是B2的MSB。 – Kristofer 2009-11-26 13:38:16