Come convertire una stringa esadecimale in un array di byte, e un array di byte in una stringa esadecimale?

Seguenti del codice di procedura byte = parseHexString (createHexString (byte)) porta di aggiornamento di byte, quello che vorrei evitare. E, come risultato, i calcoli non sono corrette.

<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>

Io non sono sviluppatore javascript, e non quello che si trova nel codice di google non ha funzionato di questo tipo di dati.

Aggiornamento 1

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

Ma se non

parseHexString('e5d109c673d8ef03df564beb9e36e9983a23842b0a724efa45ff76bbe5ad72ed‌​62d2757968'); 

codice if (sid!== ... errore

Aggiorna 2

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

di uscita:
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

Aggiorna 3

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

di uscita:

[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]
  • Quali dati si aspetta e quali sono i dati che si stanno ottenendo sono?
  • Mi aspetto che la trasformazione di dati = parseHexString (createHexString (dati)) non modificare i dati
  • Copia e incolla il tuo contributo per createHexString(rsa_privk[0]), cioè console.log(rsa_privk[0]);.
  • console.log(createHexString(rsa_privk[0])); = e5d109c673d8ef03df564beb9e36e9983a23842b0a724efa45ff76bbe5ad72ed62d2757968 Ma se non parseHexString(‘e5d109c673d8ef03df564beb9e36e9983a23842b0a724efa45ff76bbe5ad72ed62d2757968’); quindi il codice if (sid!== … errore
  • Vedere il mio aggiornati risposta, basta aggiungere il console.log linea e copiare e incollare l’intero output nella tua domanda.
  • OK, quindi se ho capito bene, si desidera solo visualizzare i dati in formato esadecimale, giusto? Perché avete bisogno di convertire di nuovo?
  • Aggiornato risposta con la soluzione… enjoy…

InformationsquelleAutor SkyN | 2013-01-30



5 Replies
  1. 8

    Aggiornamento: Scorrere verso il basso per la soluzione… Live Demo

    Il problema: si utilizza una perdita di qualità di conversione in esadecimale, che non può essere invertito.

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

    Questo non potrà mai essere lo stesso rsa_privk[0].

    Perché, createHexString() utilizza solo il last 2 bytes da ciascun elemento dell’array.

    Esempio:

    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] 

    Aggiornamento : Soluzione Di Lavoro…

    Le due funzioni… l’esagono contiene sempre 8 blocchi di byte, ciascuno per ogni elemento dell’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;
    }

    Codice di Test…

    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();
    }
    • questo non è un lavoro
    • Qual è il vostro ingresso e di uscita?
    • I dati in forma binaria nel codice di cui sopra. La domanda è: come li visualizza in formato esadecimale. Ma io sono sicuro di non ottenere il risultato corretto, perché con la trasformazione inversa dati non correttamente.
    • Che cosa è i vostri dati, come? Copiare e incollare i dati qui.
    • i dati binari, non riesco ad inserire qui i dati binari!!! esse sono calcolate nel codice di cui sopra. E non so come correttamente li converte in esadecimale e in formato binario
    • arr[i] dà indietro di un carattere. quello che vuoi è il numero di byte dal carattere che si può ottenere con .charCodeAt( … )
    • Qual è il tuo algoritmo, come? L’attuale createHexString prende gli ultimi 2 byte di dati come input. Come per l’esempio di input, 123676133, la funzione si 33. È questo ciò di cui avete bisogno nel vostro algoritmo?
    • Si prega di eseguire questo console.log(rsa_privk[0]); e incolla di uscita.
    • Ho corretto il codice… ora il tuo codice di uscite OK.
    • Crea brutto variabile globale z.
    • Basta sostituire istanza di z con il suo valore.
    • Certo, sto solo indicando che il codice di esempio inquina spazio dei nomi globale. Ti manca una “var”.
    • Oh grazie… sarà un aggiornamento 🙂

  2. 29

    Convertire una stringa esadecimale di un array di byte e viceversa

    nota: l’applicazione da crypto-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("");
    }
    • QUESTO funziona. Nient’altro ha funzionato per me. Vi ringrazio tanto.
  3. 6

    Volevo solo suonare in quanto c’è una libreria a https://github.com/dcodeIO/bytebuffer.js facilmente aiutare con le conversioni di questo tipo, e quindi non c’è bisogno di scrivere le proprie funzioni (che potrebbe non essere il più ottimale, o essere più ottimale se la soluzione è stata verificata attraverso la comunità open source su GitHub).

    var ByteBuffer = require("bytebuffer");
    
    var bb = ByteBuffer.fromHex(yourHexString);
    
    //need to convert it to base 64?
    //bb.toBase64();

    Vedere https://github.com/dcodeIO/bytebuffer.js/wiki/API#bytebufferfromhexstr-littleendian-noassert per le API documentazione e ulteriori informazioni su metodi che ho usato sopra.

  4. 0

    Qui è un esempio reale di questo 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');
    
    }
  5. 0

    Giusto per chiarire, se si desidera semplicemente hex decodificare una semplice stringa come 48656C6C6F20576F726C6421 (Hello World!) è possibile utilizzare l’OP funzione, ma invece di utilizzare una lunghezza di 8 si dovrebbe utilizzare una lunghezza di 2.

    Codice:

    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;
    }

    Uscita sarà [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]

    So che questo codice è già in OP domanda, ma non accettate risposta. Il mio intento qui è solo per dare una risposta diretta alla prima parte della domanda (How to convert a hex string into a bytes array).

Lascia un commento