簡體   English   中英

將具有IEEE-754雙精度十六進制表示的字符串轉換為JavaScript數字變量

[英]Convert a string with a hex representation of an IEEE-754 double into JavaScript numeric variable

假設我有一個十六進制數“4072508200000000”,我希望將IEEE-754雙格式中表示的浮點數(293.03173828125000)放入JavaScript變量中。

我可以想到一種使用一些屏蔽和調用pow()的方法,但是有一個更簡單的解決方案嗎?

需要客戶端解決方案。

這可能有所幫助。 這是一個允許您輸入IEEE-754的十六進制編碼並獲得尾數和指數分析的網站。

http://babbage.cs.qc.edu/IEEE-754/64bit.html

因為人們總是傾向於問“為什么?”,這就是為什么:我正在嘗試填寫Google的Procol Buffers(protobuf)現有但不完整的實現。

我不知道一個好方法。 它當然可以通過艱難的方式完成,這是一個完全在JavaScript中的單精度示例:

js> a = 0x41973333
1100428083
js> (a & 0x7fffff | 0x800000) * 1.0 / Math.pow(2,23) * Math.pow(2,  ((a>>23 & 0xff) - 127))
18.899999618530273

生產實現應該考慮到大多數字段都具有魔術值,通常通過為最大或最小的內容指定特殊解釋來實現。 因此,檢測NaN和無窮大。 上面的例子應該檢查底片。 (a&0x80000000)

更新:好的,我也是雙倍的。 你不能直接擴展上面的技術,因為內部JS表示是一個double,因此根據它的定義,它最多可以處理長度為52的位串,並且它根本不能移動超過32。

好的,要做到雙倍,你首先要把字符串切掉8位數或32位; 用一個單獨的對象處理它們。 然后:

js> a = 0x40725082      
1081233538
js> (a & 0xfffff | 0x100000) * 1.0 / Math.pow(2, 52 - 32) * Math.pow(2, ((a >> 52 - 32 & 0x7ff) - 1023))
293.03173828125
js> 

我保留了上面的例子,因為它來自OP。 更難的情況是低32位有一個值。 這是0x40725082deadbeef的轉換,一個全精度雙:

js> a = 0x40725082
1081233538
js> b = 0xdeadbeef
3735928559
js> e = (a >> 52 - 32 & 0x7ff) - 1023
8
js> (a & 0xfffff | 0x100000) * 1.0 / Math.pow(2,52-32) * Math.pow(2, e) +          
     b * 1.0 / Math.pow(2, 52) * Math.pow(2, e)
293.0319506442019
js> 

有一些明顯的子表達式可以分解,但我已經這樣離開了,所以你可以看到它與格式的關系。

這是DigitalRoss解決方案的一個快速補充,對於那些通過Google發現此頁面的人來說。

除了我喜歡輸入的+/- Infinity和NaN的邊緣情況之外,你還需要考慮結果的符號:

s = a >> 31 ? -1 : 1

然后,您可以在最終乘法中包含s以獲得正確的結果。

我認為對於小端解決方案,您還需要反轉ab的位並交換它們。

新的Typed Arrays機制允許您這樣做(並且可能是實現協議緩沖區的理想機制):

var buffer = new ArrayBuffer(8);
var bytes = new Uint8Array(buffer);
var doubles = new Float64Array(buffer); // not supported in Chrome

bytes[7] = 0x40; // Load the hex string "40 72 50 82 00 00 00 00" 
bytes[6] = 0x72;
bytes[5] = 0x50;
bytes[4] = 0x82;
bytes[3] = 0x00;
bytes[2] = 0x00;
bytes[1] = 0x00;
bytes[0] = 0x00;

my_double = doubles[0];

document.write(my_double);  // 293.03173828125

這假設是一個小端機器。

不幸的是,Chrome沒有Float64Array ,雖然它確實有Float32Array 上面的示例在Firefox 4.0.1中有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM