Hice un programa Java que me da la salida deseada usando la clase BigInteger de Java.

String key = "253D3FB468A0E24677C28A624BE0F939";
byte[] array = new BigInteger(key, 16).toByteArray();
System.out.println(Arrays.toString(array));

Con el siguiente resultado:

[37, 61, 63, -76, 104, -96, -30, 70, 119, -62, -118, 98, 75, -32, -7, 57]

Intenté hacer lo mismo usando JavaScript. Usó una biblioteca Big Int: https://github.com/peterolson/BigInteger.js porque El valor hexadecimal es demasiado largo.

var q = new bigInt("253D3FB468A0E24677C28A624BE0F939", 16); 
console.log(q.toString());

var out = q.toString();
var bytes = []; 

for (var i = 0; i < out.length; ++i) {
var code = out.charCodeAt(i);
bytes = bytes.concat([code]);
}
 console.log(bytes);

bytes = [52, 57, 52, 57, 57, 52, 53, 56, 48, 51, 55, 54, 54, 55, 55, 51, 50, 49, 49, 50, 56, 56, 51, 55 , 53, 48, 53, 50, 54, 55, 57, 52, 49, 51, 53, 56, 54, 53]

¿Cómo puedo obtener la misma salida de Java usando JavaScript? Muchas gracias

1
Sergio David Romero 13 ene. 2017 a las 23:21

3 respuestas

La mejor respuesta

No necesitas la biblioteca. Simplemente analice cada byte y agréguelo a una matriz (con alguna manipulación para imitar los bytes firmados de Java):

var q = '253D3FB468A0E24677C28A624BE0F939';
var bytes = [];
for (var i = 0; i < q.length; i += 2) {
    var byte = parseInt(q.substring(i, i + 2), 16);
    if (byte > 127) {
        byte = -(~byte & 0xFF) - 1;
    }
    bytes.push(byte);
}
console.log(bytes);
// [37, 61, 63, -76, 104, -96, -30, 70, 119, -62, -118, 98, 75, -32, -7, 57]
1
shmosel 13 ene. 2017 a las 20:50

Puede usar una conversión personalizada que ajuste numbers > 127 para números negativos.

var key = "253D3FB468A0E24677C28A624BE0F939",
    bytes = key.match(/../g).map(function (a) {
        var i = parseInt(a, 16)
        return i >> 7 ? i - (1 << 8) : i;
    });

console.log(bytes);
1
Nina Scholz 13 ene. 2017 a las 21:14

Prueba esto:

var input = "253D3FB468A0E24677C28A624BE0F939";
var output = "";
for (var i = 0; i < input.length; i += 2) {
  var value = parseInt(input.substr(i, 2), 16);
  output += ", " + (value < 128 ? value : value - 256);
}
output = "[" + output.substr(2) + "]";
1
Andreas 13 ene. 2017 a las 20:44