我想将一个十六进制数字(比如说0xABCDEF)转换成一个数组(0xABCDEF-> [0xAB; 0xCD; 0xEF]
我已经测试了这段代码:
generateHexaArrayOf2FromHexaNumber (hexaNb){
var size = 1;
var hexaNbTempo = hexaNb;
while ((hexaNbTempo / 0xFF) > 1) {
hexaNbTempo = hexaNbTempo / 0xFF;
size++;
}
var hexaArray = new Array(size);
for (var i= 0; hexaNb > 0; i++) {
hexaArray[i] = hexaNb % 0xFF
hexaNb = Math.floor(hexaNb / 0xFF) // round to lower
}
hexaArray.reverse();
return hexaArray;
}
结果以ASCII而不是六进制返回(具有 以0xABCDEF作为条目,它返回[173(= 0xAD),39(= 0x27),105(= 0x69)]
您知道错误的原因以及如何纠正它吗?
答案 0 :(得分:1)
将所有0xFF
替换为0x100
。毕竟,您要制作一个以256为基数的数组,而不是以255为基数的数组。
此外,您确实不需要进行size
计算。您也可以直接返回hexaArray.reverse()
。另外,使用push
代替直接属性分配。您的代码还将输入0
的数组留空了,但是您不希望[0]
作为输出吗?
您也可以使用.push
代替.unshift
并删除.reverse()
。
更正的代码:
function generateHexaArrayOf2FromHexaNumber(hexaNb) {
var hexaArray = [];
for (var i = 0; hexaNb > 0; i++) {
hexaArray.push(hexaNb % 0x100);
hexaNb = Math.floor(hexaNb / 0x100);
}
if(!hexaArray.length){
hexaArray.push(0);
}
return hexaArray.reverse();
}
console.log(generateHexaArrayOf2FromHexaNumber(0x1)); // => [ 1 ]
console.log(generateHexaArrayOf2FromHexaNumber(0xabcdef)); // => [ 171, 205, 239 ]
console.log(generateHexaArrayOf2FromHexaNumber(0xabcdef).map((x) => x.toString(16).padStart(2, "0"))); // => [ "ab", "cd", "ef" ]
console.log(generateHexaArrayOf2FromHexaNumber(0xdeadbeef).map((x) => x.toString(16).padStart(2, "0"))); // => [ "de", "ad", "be", "ef" ]
console.log(generateHexaArrayOf2FromHexaNumber(0x0).map((x) => x.toString(16).padStart(2, "0"))); // => [ "00" ]