将十六进制数转换为数组

时间:2019-01-14 13:38:31

标签: javascript hex

我想将一个十六进制数字(比如说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)]

您知道错误的原因以及如何纠正它吗?

1 个答案:

答案 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" ]