2017-12-04 3 views
2

Ich habe ein Array, das 32 Bit, big endian unsignierte ganze Zahlen ist, im Grunde in Klartext ist wie folgt [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]Base64 binärer decode 32 Bitfeld

Der 32bit endian Array selbst wird in binärer Base64 codiert AAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEA==

Zunächst, wenn ich dies vom Himmel bekomme, wie kann ich jetzt alles zu dieser verständlichen Klartextdarstellung in JavaScript dekodieren/entpacken.

In Ruby kann ich einfach verwenden Base64.decode und String#Unpack

encoded_string = 'AAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEA==' 

decoded_string = Base64.strict_decode64(encoded_string) 
    => "\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\t\x00\x00\x00\n\x00\x00\x00\v\x00\x00\x00\f\x00\x00\x00\r\x00\x00\x00\x0E\x00\x00\x00\x0F\x00\x00\x00\x10" 

decoded_string.unpack('N*') #32-bit unsigned, network (big-endian) byte order 
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 

Gibt es ein Äquivalent von diesem einfachen Schritt in JavaScript.

+0

Sie können einen Blick darauf werfen: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding Es sollte die Werkzeuge sein, nach denen Sie suchen. – Bellian

+0

Warum hat das ein [Ruby] -Tag? –

Antwort

1

Sie könnten die angegebene Zeichenfolge entschlüsseln und onyl vier Zeichen, um eine 32-Bit-Zahl für convering von ArrayBuffer und DataView mit

function getInt(string) { 
 
    var view = new DataView(new ArrayBuffer(4)), 
 
     i; 
 

 
    for (i = 0; i < string.length; i++) { 
 
     view.setUint8(i, string.charCodeAt(i)); 
 
    } 
 
    return view.getInt32(0); 
 
} 
 

 
var encodedData = 'AAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEA==', 
 
    decodedData = window.atob(encodedData), 
 
    result = [], 
 
    i = 0; 
 

 
while (i < decodedData.length) { 
 
    result.push(getInt(decodedData.slice(i, i += 4))); 
 
} 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Gibt es dafür in der Knotenkonsole ein Äquivalent? – arjun

+0

Ich weiß Knoten nicht. –

+1

Statt 'window.atob' installieren Sie das' atob'-Paket und 'let atob = require (' atob ') '. Der Rest sollte ohne Änderungen funktionieren. – Amadan

0

Okay, nach einiger strengen Suche fand ich diese Bibliothek spezifische zu diesem Zweck - https://www.npmjs.com/package/binary

Bietet auch andere Kodierungen

encoded_string = 'AAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEA==' 
let buffer = new Buffer(encoded_string, 'base64'); 
let arrayList = []; 
let binaryList = binary.parse(buffer); 
for (var i = 0; i <(buffer.length/4); i++) { 
    arrayList.push(binaryList.word32bu('a').vars.a); 
};