我有從web服務檢索數值矢量JavaScript代碼。原始數據是一個雙精度數組,它被轉換爲一個字節數組,然後進行base64編碼。我使用JavaScript解碼base64,但是我不知道如何將結果字節轉換爲數字數組。轉換字節數組編號在JavaScript
1
A
回答
3
這是我能想到的把我的頭頂部做的唯一途徑。
function bytesToDouble(str,start) {
start *= 8;
var data = [str.charCodeAt(start+7),
str.charCodeAt(start+6),
str.charCodeAt(start+5),
str.charCodeAt(start+4),
str.charCodeAt(start+3),
str.charCodeAt(start+2),
str.charCodeAt(start+1),
str.charCodeAt(start+0)];
var sign = (data[0] & 1<<7)>>7;
var exponent = (((data[0] & 127) << 4) | (data[1]&(15<<4))>>4);
if(exponent == 0) return 0;
if(exponent == 0x7ff) return (sign) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
var mul = Math.pow(2,exponent - 1023 - 52);
var mantissa = data[7]+
data[6]*Math.pow(2,8*1)+
data[5]*Math.pow(2,8*2)+
data[4]*Math.pow(2,8*3)+
data[3]*Math.pow(2,8*4)+
data[2]*Math.pow(2,8*5)+
(data[1]&15)*Math.pow(2,8*6)+
Math.pow(2,52);
return Math.pow(-1,sign)*mantissa*mul;
}
var data = atob("AAAAAABsskAAAAAAAPmxQAAAAAAAKrF");
alert(bytesToDouble(data,0)); // 4716.0
alert(bytesToDouble(data,1)); // 4601.0
這應該給你在正確的方向一推,雖然我花了一段記住如何應對doubles。
一個很大的警告雖然值得注意:
這依賴於atob
做的base64解碼,這是不是到處的支持,除了那可能並不是一個好主意呢。你真正想要做的是將base64編碼的字符串展開成一個數組數組(儘管不是這個星球上最有效的東西,字節將是最容易使用的)。原因是當atob
發揮它的魔力時,它會返回一個字符串,這非常不理想。根據它映射到的代碼點的編碼(特別是對於128和255之間的代碼點),結果.charCodeAt()
可能不會返回您所期望的。
還有可能會有一些準確性問題,因爲畢竟我使用雙倍計算雙倍,但我認爲它可能沒問題。
Base64是相當瑣碎的工作,所以你應該能夠計算的那部分。
如果你切換到一個數組(而不是現在的str
字符串),那麼你顯然會刪除.charCodeAt()
引用並直接得到你想要的索引。
+0
T這對我很有用,我使用其他代碼來解碼base64,所以不要太在意'atob'問題。我會密切關注準確性問題,但總的來說,我的數據不需要非常高的精度,所以應該沒問題。 – Abiel
0
我認爲,我們已經使用的Web服務(C#)這個函數來編碼雙陣列數據字符串:
//Input: [552.4, 539.8]
//Output: IOz0gCAsscA=
private string ConvertToSerializableString(double[] input)
{
byte[] data = new byte[input.Length * 4];
for (int i = 0; i < input.Length; i++)
{
int source = (int)(input[i] * 1E6);
int dataIndex = i * 4;
data[dataIndex] = (byte)((source >> 24) & 0xFF);
data[dataIndex + 1] = (byte)((source >> 16) & 0xFF);
data[dataIndex + 2] = (byte)((source >> 8) & 0xFF);
data[dataIndex + 3] = (byte)(source & 0xFF);
}
return Convert.ToBase64String(data);
}
然後我們可以使用下面的客戶端腳本( JavaScript的),將其解碼:
var base64EncodedDoubleArrayData = "IOz0gCAsscA=";
var byteData = window.atob(base64EncodedDoubleArrayData);
var doubleArray = [];
for (var iColumn = 0; iColumn < byteData.length; iColumn = iColumn + 4)
{
var item = (byteData.charCodeAt(iColumn) << 24) + (byteData.charCodeAt(iColumn + 1) << 16) + (byteData.charCodeAt(iColumn + 2) << 8) + byteData.charCodeAt(iColumn + 3);
var doubleResult = parseFloat(item/1e6);
doubleArray.push(doubleResult);
}
//it should return something like doubleArray = [552.4, 539.8]
相關問題
- 1. 字節轉換的編號
- 2. javascript中的雙字節數組轉換
- 3. 轉換數字節數組
- 4. 轉換字節數組INT
- 5. 將無符號字節數組轉換爲Structs數組
- 6. 字節數組十六進制字符串轉換在JavaScript
- 7. 如何在javascript中將字節數組轉換爲字符串
- 8. 將字符串數組(字節值)轉換爲字節數組
- 9. 將字節數組轉換回字節數組返回字節數組
- 10. 將JavaScript中的數字轉換爲4字節的數組
- 11. 在javascript中轉換數字數組toString()
- 12. 將Java字節數組轉換爲Python字節數組
- 13. 將PNG壓縮字節數組轉換爲BMP字節數組
- 14. 將三維字節數組轉換爲單字節數組
- 15. 如何將Java字節數組轉換爲Scala字節數組?
- 16. 將字節數組轉換爲VB6中的帶符號整數
- 17. 將DWORD字節數組轉換爲無符號長數
- 18. 如何將有符號字節數組轉換爲浮點數?
- 19. 轉換字節數組二進制在JavaScript
- 20. 字符串轉換爲字節數組
- 21. 如何將unicode JavaScript字符串轉換爲字節數組?
- 22. 轉換字節數組爲uint數值
- 23. 轉換字節數組爲整數
- 24. 將byte []數組轉換爲字節數
- 25. 轉換Base64編碼字符串到字節數組
- 26. 轉換一個字節數組編碼字符串
- 27. MIX DIV運算符和打包字節數的轉換編號
- 28. 轉換JavaScript整數到字節數組,並返回
- 29. 將字節數組轉換爲字符串的字節數
- 30. 讀取字節值在文件轉換成字節數組
我不知道你的數據是什麼樣子,但你可以使用.split使從分隔的數據數組(「delimiterCharacter」) –
呃,雙倍數據作爲字節序列 - 我想,你必須手動實現這一點。 [在這個問題](http://stackoverflow.com/questions/2905556/how-can-i-convert-a-byte-array-into-a-double-and-back)我發現一個算法來轉換一個雙成字節,也許你可以扭轉它。 – Yogu
你能提供一些樣本數據嗎? –