我有一个表单的字节数组[4,-101,122,-41,-30,23,-28,3,..]
,我想以6d69f597b217fa333246c2c8
我在函数下面使用的形式转换
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
您缺少十六进制转换中的填充.你会想要使用
function toHexString(byteArray) { return Array.from(byteArray, function(byte) { return ('0' + (byte & 0xFF).toString(16)).slice(-2); }).join('') }
这样每个字节就可以转换成两个十六进制数字.你的预期产量是04812d7e3a9829e5d51bdd64ceb35df060699bc1309731bd6e6f1a5443a7f9ce0af4382fcfd6f5f8a08bb2619709c2d49fb771601770f2c267985af2754e1f8cf9
map()
如果输入的类型如Uint8Array
:,则使用将不起作用:的结果map()
也Uint8Array
不能保存字符串转换的结果。
function toHexString(byteArray) { var s = '0x'; byteArray.forEach(function(byte) { s += ('0' + (byte & 0xFF).toString(16)).slice(-2); }); return s; }
使用Array.reduce()更简洁,更高效(参见https://jsperf.com/byte-array-to-hex-string)替代方案:
function toHexString(byteArray) { return byteArray.reduce((output, elem) => (output + ('0' + elem.toString(16)).slice(-2)), ''); }
(也没有"&0xFF",因为在我看来如果传入一个包含大于255的值的数组,输出应该搞乱,这样用户可以更容易地看到他们的输入是错误的.)