Wie konvertiert man einen Hex-String in ein Byte-Array und ein Byte-Array in den Hex-String?

Lesezeit: 8 Minuten

Benutzer-Avatar
SkyN

Das folgende Codeverfahren bytes = parseHexString (createHexString (bytes)) führt von Bytes aktualisiert, was ich vermeiden möchte. Und als Ergebnis sind die Berechnungen nicht korrekt.

<html>
<head>
<SCRIPT SRC="http://eu.static.mega.co.nz/sjcl_1.js"></SCRIPT>
<SCRIPT SRC="http://eu.static.mega.co.nz/crypto_1.js"></SCRIPT>
<SCRIPT SRC="http://eu.static.mega.co.nz/rsa_1.js"></SCRIPT>
<SCRIPT SRC="http://eu.static.mega.co.nz/hex_1.js"></SCRIPT>
<SCRIPT>
function parseHexString(str) { 
    var result = [];
    while (str.length >= 2) { 
        result.push(parseInt(str.substring(0, 2), 16));
        str = str.substring(2, str.length);
    }

    return result;
}

function createHexString(arr) {
    var result = "";
    for (i in arr) {
        var str = arr[i].toString(16);
        str = str.length == 0 ? "00" :
              str.length == 1 ? "0" + str : 
              str.length == 2 ? str :
              str.substring(str.length-2, str.length);
        result += str;
    }
    return result;
}

function t()
{
    var json_k     = 'aOrP5yLtNQT53WMQfufSlA';
    var json_csid  = 'CABD6JUMldvI_eqP0537xl9P8x7kgk2OjOq99Fy7kosphj6AFUtlbwRRDpg4EIifXRLO6FNpdD22WwtUlJ_1Mgye2Y87trEqLCbhahuEFJVQNMDtNbIem7xY2ER9uF-cdgBXZWuzp7XIBybSh7W8MSUlv_eGS6LcLGJ81Q49dSzVhcswHTJ_IJl04p3c0axR6ZIJ8dH5bJ_vXvgQsypUVVtdfMacKhB9cXdEtRZ6iWLKCKqscXdo6CNXlbIdzRhro0gxfmhfB_miysFAiSQrbtuYnIgYBU3i9p3jRlPD4ti3CUcnj0SomV61w1aEYNvo56HPMUZlVkVHA7BFzvHGHo0J';
    var json_privk = 'K7LDtk2M2QhjJx_v_Hqf0LKUBaZx76U_vBDjQty9HpFDy2MntF5HxxuyHQ9-1HmXeYzbL1pZnAxsZ7LRUbDnkR6qtJVaGdWuQhrytkuq0l5zBp-O--gZxoQPRGTsVgVRdAvpsRTkQI_q8fxADLCe0womFxtvvnD_FJgjaMsm7vkYchXkoq33WWyHijb3JMkymjl0_GtiSamT0qEL6sm_l5Z1lehqBGUEHfYAa0ub8IDx_yqy2R9Nh8Lwzmz4s24sShVxjaNsMBlSE-sEvTziOsnNWK1Zl_XUYadlENkweuIoxYx_lt8XIV71TzjEFuVTd-pXhzVlqePmIu3SM3bO1Kzq_DnGfB62RmzlmbtHU4iyw4Hd1wQFRhTeSRrvMjsMPFKN-SIIQU7CRNaMuaDxZbNZcOKhMg_h9mApM0rRS3VZaGZzFTL9rSaDMYHw4pL3aOkSFPMY3w785Tss7Zqwuo9HFUWUVbnYAb97JkgCohlMotORrMMtual1dQ4sG1sIYXyWTckAGGL0ZAGurhtSKiyz1m8Lb39pXPacqFh_nCHqqb2_RdrKTj0PdGZESKkU8YedeqC1I9nR4v38DuQc-pBBR5DOwgNjJMvzvsUehs_PxIL8THjgIcr7ONc4hWV9o2v_l81Vo2cCW2I99Iz84IFN2fV1dTqHIG_tnLzz8ljBVygETUqrFdZ0JlQJkurZ7RBku5krm-k9CZmDezCIzPPil-RcYzVIk00gNYAxfiZE48Or4WEiGjgKLnHCYVtSlvlMF4bPGB4SVCZ-68j49EjfSWaMK0OoMkpGhqf7KchgxYBZq6o3AhLgp4t0BClvsdee6VTz1SFqc3m2A-TMG6fNdbCT_Q9nYCYdZIROdOc';

    var aes = new sjcl.cipher.aes( prepare_key_pw("oEyoo9cQcw") );
    k = decrypt_key(aes, base64_to_a32(json_k) );

    aes = new sjcl.cipher.aes(k);

    var t = mpi2b(base64urldecode(json_csid));

    var privk = a32_to_str(decrypt_key(aes,base64_to_a32(json_privk)));

    var rsa_privk = Array(4);
    for (var i = 0; i < 4; i++)
    {
        var l = ((privk.charCodeAt(0)*256+privk.charCodeAt(1)+7)>>3)+2;

        rsa_privk[i] = mpi2b(privk.substr(0,l));
        if (typeof rsa_privk[i] == 'number') break;
        privk = privk.substr(l);    
    }

    var p = parseHexString(createHexString(rsa_privk[0]));  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!
    var q = parseHexString(createHexString(rsa_privk[1]));  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!
    var d = parseHexString(createHexString(rsa_privk[2]));  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!
    var u = parseHexString(createHexString(rsa_privk[3]));  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!
    sid = base64urlencode(b2s(RSAdecrypt(t,d,p,q,u)).substr(0,43));
    if (sid!=='tajetAbW0qTQGFlwp8iD5lQ0TFV1QUZJZFVvjRX7Xx-bPzYBoau7qog09w')
        console.log("ERROR");

    p = rsa_privk[0];
    q = rsa_privk[1];
    d = rsa_privk[2];
    u = rsa_privk[3];
    sid = base64urlencode(b2s(RSAdecrypt(t,d,p,q,u)).substr(0,43));
    if (sid=='tajetAbW0qTQGFlwp8iD5lQ0TFV1QUZJZFVvjRX7Xx-bPzYBoau7qog09w')
        console.log("OK");
}
</script>

</head>
<body onload="t();"></body>
</html>

Ich bin kein Javascript-Entwickler, und keiner, der in Google-Code gefunden wurde, hat nicht funktioniert auf diesen Daten.

Aktualisierung 1

console.log(createHexString(rsa_privk[0])); = e5d109c673d8ef03df564beb9e36e9983a23842b0a724efa45ff76bbe5ad72ed62d2757968 

Aber wenn

parseHexString('e5d109c673d8ef03df564beb9e36e9983a23842b0a724efa45ff76bbe5ad72ed‌​62d2757968'); 

dann codieren if (sid!== ... Fehler machen

Aktualisierung 2

console.log(rsa_privk[0].toString(16));

output: 123676133,198914513,129998601,245147334,11918451,206998232,96766191,75984899,177840095,106709334,10180427,208237547,119814814,127003446,189062377,84099480,220452154,250519075,267883908,115471915,165124106,238628722,169382478,42320122, 95982405,80725759,89608310,85166267,200925925,254033325,86971506,191278317,127411298,180195794,142776693,188738169,39016

Aktualisierung 3

console.log(parseHexString(createHexString(rsa_privk[0])));
console.log(rsa_privk[0]);

Ausgang:

[229, 209, 9, 198, 115, 216, 239, 3, 223, 86, 75, 235, 158, 54, 233, 152, 58, 35, 132, 43, 10, 114, 78, 250, 69, 255, 118, 187, 229, 173, 114, 237, 98, 210, 117, 121, 104]

[123676133, 198914513, 129998601, 245147334, 11918451, 206998232, 96766191, 75984899, 177840095, 106709334, 10180427, 208237547, 119814814, 127003446, 189062377, 84099480, 220452154, 250519075, 267883908, 115471915, 165124106, 238628722, 169382478, 42320122, 95982405, 80725759, 89608310, 85166267, 200925925, 254033325, 86971506, 191278317, 127411298, 180195794, 142776693, 188738169, 39016]

  • Welche Daten erwarten Sie und welche Daten erhalten Sie?

    – ATozTOA

    30. Januar 2013 um 11:47 Uhr

  • Ich erwarte, dass die Transformation data = parseHexString (createHexString (data)) die Daten nicht ändert

    – SkyN

    30. Januar 2013 um 11:51 Uhr

  • Kopieren Sie Ihre Eingabe und fügen Sie sie ein createHexString(rsa_privk[0])dh console.log(rsa_privk[0]);.

    – ATozTOA

    30. Januar 2013 um 11:59 Uhr

  • console.log(createHexString(rsa_privk[0])); = e5d109c673d8ef03df564beb9e36e9983a23842B0A724EFA45FF76BBE5AD72D62D2757968 But If do ParseHexstring (‘E5D1099983Adn03d803df564be564be564be564be564be564be564be564be564be564BeB9E36E9983Ad2. dann Code if (sid!== … Fehler machen

    – SkyN

    30. Januar 2013 um 12:10 Uhr


  • Siehe meine aktualisierte Antwort, fügen Sie einfach die hinzu console.log line und kopieren Sie die gesamte Ausgabe in Ihre Frage.

    – ATozTOA

    30. Januar 2013 um 12:25 Uhr

Benutzer-Avatar
Quark

Konvertieren Sie einen Hex-String in ein Byte-Array und umgekehrt

Hinweis: Umsetzung ab Krypto-js

// Convert a hex string to a byte array
function hexToBytes(hex) {
    for (var bytes = [], c = 0; c < hex.length; c += 2)
        bytes.push(parseInt(hex.substr(c, 2), 16));
    return bytes;
}

// Convert a byte array to a hex string
function bytesToHex(bytes) {
    for (var hex = [], i = 0; i < bytes.length; i++) {
        var current = bytes[i] < 0 ? bytes[i] + 256 : bytes[i];
        hex.push((current >>> 4).toString(16));
        hex.push((current & 0xF).toString(16));
    }
    return hex.join("");
}

  • Das funktioniert. Nichts anderes hat bei mir funktioniert. Vielen Dank.

    – finster

    10. September 2019 um 20:37 Uhr

  • Nur zur Erinnerung, die Crypto-js-API wurde in CryptoJS.enc.Hex.parse() geändert, es gibt kein hexToBytes

    – Quilang

    11. November 2020 um 6:45 Uhr

  • Der Code hat sich gegenüber dem Original etwas geändert. Hier ist der Link zu den neuesten Methoden bytesToHex (stringify) und hexToBytes (parse): crypto-js/core.js#L390

    – Tranzium

    2. Januar 2021 um 2:17 Uhr

  • bytesToHex rechnet unter manchen Umständen seltsam. z.B [159,15] als ‘9f0f’ berechnet wurde, sollte es ‘9ff’ sein. [25,255] funktioniert wieder. Ist das eine Endianess-Sache? Die Probleme beginnen mit dem 9. Bit des ersten Array-Elements. Die Funktion createHexString aus der akzeptierten Antwort funktioniert bei mir.

    – TefoD

    4. Februar 2021 um 7:38 Uhr


  • @TefoD Ich kann Ihr Problem nicht reproduzieren. der Code funktioniert gut für mich

    – Roman Podlinov

    3. Juni 2021 um 12:57 Uhr

Benutzer-Avatar
ATOzTOA

Update: Für die Lösung nach unten scrollen … Live-Demo

Das Problem: Sie verwenden eine verlustbehaftete Konvertierung in Hex, die nicht rückgängig gemacht werden kann.

var p = parseHexString(createHexString(rsa_privk[0]));

Dies wird niemals dasselbe sein wie rsa_privk[0].

Weil, createHexString() verwendet nur die last 2 bytes von jedem Array-Element.

Beispiel:

rsa_privk[0] : [123676133, 198914513, 129998601, 245147334, 11918451, 206998232, 96766191, 75984899, 177840095, 106709334, 10180427, 208237547, 119814814, 127003446, 189062377, 84099480, 220452154, 250519075, 267883908, 115471915, 165124106, 238628722, 169382478, 42320122, 95982405, 80725759, 89608310, 85166267, 200925925, 254033325, 86971506, 191278317, 127411298, 180195794, 142776693, 188738169, 39016]

createHexString(rsa_privk[0]) : e5d109c673d8ef03df564beb9e36e9983a23842b0a724efa45ff76bbe5ad72ed62d2757968

parseHexString(createHexString(rsa_privk[0])) : [229, 209, 9, 198, 115, 216, 239, 3, 223, 86, 75, 235, 158, 54, 233, 152, 58, 35, 132, 43, 10, 114, 78, 250, 69, 255, 118, 187, 229, 173, 114, 237, 98, 210, 117, 121, 104] 

Update: Arbeitslösung …

Die beiden Funktionen… das Hex enthält immer 8-Byte-Blöcke, jeweils für jedes Element im Array…

function parseHexString(str) { 
    var result = [];
    while (str.length >= 8) { 
        result.push(parseInt(str.substring(0, 8), 16));

        str = str.substring(8, str.length);
    }

    return result;
}

function createHexString(arr) {
    var result = "";
    var z;

    for (var i = 0; i < arr.length; i++) {
        var str = arr[i].toString(16);

        z = 8 - str.length + 1;
        str = Array(z).join("0") + str;

        result += str;
    }

    return result;
}

Code testen…

function test() {   
    a = [123676133, 198914513, 129998601, 245147334, 11918451, 206998232, 96766191, 75984899, 177840095, 106709334, 10180427, 208237547, 119814814, 127003446, 189062377, 84099480, 220452154, 250519075, 267883908, 115471915, 165124106, 238628722, 169382478, 42320122, 95982405, 80725759, 89608310, 85166267, 200925925, 254033325, 86971506, 191278317, 127411298, 180195794, 142776693, 188738169, 39016];

    console.log("Input");
    console.log(a);

    b = createHexString(a);

    console.log("Hex");
    console.log(b);

    c = parseHexString(b); 

    console.log("Output");
    console.log(c);

    if(checkIfEqual(a, c)) {
        alert("Same");
    }
}

function checkIfEqual(arr1, arr2) {
    if (arr1.length != arr2.length) {
        return false;
    }
    //sort them first, then join them and just compare the strings
    return arr1.sort().join() == arr2.sort().join();
}

  • Was ist Ihr Input und Output?

    – ATozTOA

    30. Januar 2013 um 11:49 Uhr

  • Die Daten sind im obigen Code in binärer Form. Die Frage ist, wie man sie im Hex-Format anzeigt. Aber ich bin sicher, dass ich nicht das richtige Ergebnis bekomme, weil mit inverser Transformation die Daten nicht korrekt sind.

    – SkyN

    30. Januar 2013 um 11:57 Uhr

  • Wie sind Ihre Daten? Kopieren Sie die Daten hier.

    – ATozTOA

    30. Januar 2013 um 12:07 Uhr

  • Daten sind Binärdaten, ich kann hier keine Binärdaten einfügen!!! sie werden im obigen Code berechnet. Und ich weiß nicht, wie ich sie richtig in Hex und zurück in Binär umwandeln kann

    – SkyN

    30. Januar 2013 um 12:13 Uhr

  • Arr[i] gibt einen Charakter zurück. Was Sie wollen, ist die Bytenummer aus dem Zeichen, das Sie mit .charCodeAt( … ) erhalten können.

    – DoXicK

    30. Januar 2013 um 12:37 Uhr

Ich wollte nur anmerken, dass es hier eine Bibliothek gibt https://github.com/dcodeIO/bytebuffer.js um bei Konvertierungen wie dieser einfach zu helfen, und Sie müssen daher keine eigenen Funktionen schreiben (die möglicherweise nicht optimal sind oder optimaler sind, wenn Ihre Lösung von der Open-Source-Community auf GitHub überprüft wurde).

var ByteBuffer = require("bytebuffer");

var bb = ByteBuffer.fromHex(yourHexString);

// need to convert it to base 64?
// bb.toBase64();

Sehen https://github.com/dcodeIO/bytebuffer.js/wiki/API#bytebufferfromhexstr-littleendian-noassert für die API-Dokumentation und mehr Einblick in die Methoden, die ich oben verwendet habe.

Nur zur Verdeutlichung, wenn Sie einfach eine einfache Zeichenfolge wie z 48656C6C6F20576F726C6421 (Hello World!) können Sie die OP-Funktion verwenden, aber anstatt eine Länge von 8 zu verwenden, sollten Sie eine Länge von 2 verwenden.

Code:

var DecodeHexStringToByteArray = function (hexString) {
   var result = [];
   while (hexString.length >= 2) { 
       result.push(parseInt(hexString.substring(0, 2), 16));
       hexString = hexString.substring(2, hexString.length);
   }
   return result;
}

Ausgabe wird [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]

Ich weiß, dass dieser Code bereits in der OP-Frage enthalten ist, aber nicht in der akzeptierten Antwort. Meine Absicht hier ist nur, eine direkte Antwort auf den ersten Teil der gestellten Frage zu geben (How to convert a hex string into a bytes array).

Ich habe hier eine Lösung gefunden Geben Sie hier die Linkbeschreibung ein

function hexStringToByteArray(hexString) {
    if (hexString.length % 2 !== 0) {
        throw "Must have an even number of hex digits to convert to bytes";
    }
    var numBytes = hexString.length / 2;
    var byteArray = new Uint8Array(numBytes);
    for (var i=0; i<numBytes; i++) {
        byteArray[i] = parseInt(hexString.substr(i*2, 2), 16);
    }
    return byteArray;
}

Nochmals vielen Dank http://www.java2s.com

Benutzer-Avatar
Vinzenz

Hier ist ein Live-Beispiel für diesen Test.

http://jsfiddle.net/vincentwang2020/eks1z4g2/

function testcreateHexString()
{
    alert('test function createHexString');
    var key = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24];
    var result = createHexString(key);
    alert ('Hex value:' + result);

    alert('test function parseHexString');

    var key2 = parseHexString(result);

    if (key.sort().join() == key2.sort().join())
        alert ('Matched');

}

1011350cookie-checkWie konvertiert man einen Hex-String in ein Byte-Array und ein Byte-Array in den Hex-String?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy