2015-12-16 158 views
8

我有形式[4,-101,122,-41,-30,23,-28,3,..]的字節數組,我想在形式轉化6d69f597b217fa333246c2c8 我使用下面的函數字節數組十六進制字符串轉換在JavaScript

function toHexString(bytes) { 
    return bytes.map(function(byte) { 
    return (byte & 0xFF).toString(16) 
    }).join('') 
} 

這是給我的一個字符串相同的形式,但我懷疑這不是一個有效的轉換,因爲十六進制字符串比預期的短一點。我認爲翻譯應該得到「0a10a6dc」。 請告訴我,如果我錯了,或者這是一個正確的轉換,但也許我沒有使用正確的字節數組

字節數組4,-127,45,126,58,-104,41,-27,-43,27,-35,100,-50,-77,93,-16,96,105,-101,-63,48,-105,49,-67,110,111,26,84,67,-89,-7,-50,10,-12,56,47,-49,-42,-11,-8,-96,-117,-78,97,-105,9,-62,-44,-97,-73,113,96,23,112,-14,-62,103,-104,90,-14,117,78,31,-116,-7

相應的轉換4812d7e3a9829e5d51bdd64ceb35df060699bc1309731bd6e6f1a5443a7f9ceaf4382fcfd6f5f8a08bb261979c2d49fb771601770f2c267985af2754e1f8cf9

+0

對不起,我更新了代碼。我在發佈之前更改了變量,但現在我使用的是原始代碼 – Actung

回答

24

你缺少在填充十六進制轉換。您需要使用

function toHexString(byteArray) { 
    return Array.from(byteArray, function(byte) { 
    return ('0' + (byte & 0xFF).toString(16)).slice(-2); 
    }).join('') 
} 

這樣每個字節就會轉換爲兩個十六進制數字。您的預期輸出將爲04812d7e3a9829e5d51bdd64ceb35df060699bc1309731bd6e6f1a5443a7f9ce0af4382fcfd6f5f8a08bb2619709c2d49fb771601770f2c267985af2754e1f8cf9

+0

感謝@Bergi它的工作:) – Actung

+0

如果byteArray是不能保存字符串值的類型數組,則不會工作:如果傳入Uint8Array, map的結果也會是一個Uint8Array,所以像「ff」這樣的值不會讓它加入()。 – grantpatterson

+0

@grantpatterson啊,對。固定。 – Bergi

1

您需要使用適當數量的前導零填充十六進制轉換。

1

使用map()如果輸入是一種像Uint8Array將無法​​正常工作:的map()結果也是Uint8Array也不能容納字符串轉換的結果。

function toHexString(byteArray) { 
    var s = '0x'; 
    byteArray.forEach(function(byte) { 
    s += ('0' + (byte & 0xFF).toString(16)).slice(-2); 
    }); 
    return s; 
} 
相關問題