2016-04-11 8 views
0

Für die API arbeite ich an, ich habe durch diese Regeln Bytes Zeichen zur Karte:Wie werden binäre Daten in JavaScript in Zeichen umgewandelt?

  • Bytes 0x20 bis 0x24 inklusive sind mit den entsprechenden Zeichen abgebildet U + 0020 U + 0024 einschließlich.
  • Byte 0x26 bis 0x7E inklusive sind den entsprechenden Zeichen U + 0026 bis U + 007E inklusive zugeordnet.
  • Andere Bytes werden der drei Zeichenfolgen zugeordnet, die aus einem Prozentzeichen bestehen, gefolgt von zwei Großbuchstaben, z. Byte 0 entspricht "% 00" und Byte 0xAB entspricht "% AB".

Das ist für die Codierung, ich muss Funktion für die Decodierung auch machen.

Ist das vielleicht eine vorhandene Codierung? Ich habe es gegoogelt, konnte aber nichts finden. Ich weiß, U + ist für Unicode.

Kann ich wo es gerade mag:

if(bytesArray[i] == 0x21) 
{ 
    bytesArray[i] = U+0021; 
} 

?

+0

['String.fromCharCode()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode) – Pointy

+2

Für Ihr Beispiel 'if (bytesArray [ i] == 0x21) 'Sie müssen die Kodierung nicht ändern - es sei denn, Sie ändern sie (pro JavaScript-Regeln) von 'number' in 'string'. Welcher Datentyp ist 'BytesArray'? – usr2564301

+0

Daten, die an die Funktion übergeben werden (per Spezifikation), sind Strings. – ZIvesic

Antwort

0

Da Sie Werte in eine Zeichenfolge übersetzen, können Sie String.replace verwenden. Die einzige Sache, die wirklich ersetzt werden muss, ist die Notation %XX; andere Charaktere können unverändert bleiben.

In diesem Fall können Sie die definierte Funktion Benutzer verwenden des replace Befehl:

decodedArray = byteArray.replace (/%([0-9A-F][0-9A-F])/g, 
    function (match, p1) 
    { 
     return String.fromCharCode(parseInt(p1, 16)); 
    }); 

Dies ist ein sicherer Betrieb, weil gemäß der Spezifikation, eine wörtliche % Zeichen, das nicht in der codierten Zeichenfolge erscheinen (falls Sie sich fragen: Das ist der Code 0x25, der im ansonsten druckbaren ASCII-Bereich hervorgehoben wird. Selbst wenn ein streunender % in der Zeichenfolge erscheint, wird er nur ersetzt, wenn tatsächlich zwei gültige großgeschriebene Hex-Bytes folgen.

Encoding ist ähnlich einfach:

encodedArray = originalString.replace (/[^ -$&-~]/g, 
    function (match) 
    { 
     if (match.charCodeAt(0) < 16) 
      return '%0'+match.charCodeAt(0).toString(16).toUpperCase(); 
     return '%'+match.charCodeAt(0).toString(16).toUpperCase(); 
    }); 

Hinweis des 'match' regex ist die genaue ASCII Darstellung Ihrer zu-übersetzte Codeliste; Es wird negiert, weil Sie alle Zeichen außerhalb dieser Bereich finden möchten.

Dies funktioniert besser als ein Mapping, da Sie dafür jedes Zeichen manuell durchlaufen müssen, um zu entscheiden, ob es übersetzt werden muss oder nicht. Dies würde vernünftig für Encoding (Sie würden eine Liste aller Codes, mit einem ein-oder 3-Byte-String, für den es codiert) funktionieren, aber für Decoding müssten Sie 2 Bytes voraus schauen, testen wenn sie gültig sind (!), und überspringe sie wenn es so ist. Im Vergleich dazu sollte die replace Lösung viel schneller sein.

+0

Ich denke das war's. Was ist dieses 'part' Argument in der ersten Funktion? – ZIvesic

+0

@ZIvesic: Fügte einen Link für eine 'replace'-Referenz hinzu. Der korrekte Name für 'part' war eigentlich' p1' - siehe [Eine Funktion als Parameter angeben] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace # Specifying_a_function_as_a_parameter). Sie können entweder die vollständige gefundene Zeichenfolge oder eine der Gruppen im Suchparameter verwenden. In diesem Fall möchten Sie die erste Gruppe nur in der Ersatzfunktion verwenden. – usr2564301

+0

Bei der Decodierung habe ich zwei zusätzliche Anforderungen: - Ein Prozentzeichen, das nicht von zwei Großbuchstaben Hex Zeichen gefolgt wird, bedeutet, dass die Zeichenfolge falsch formatiert ist. - Wenn die Zeichenfolge ein Zeichen außerhalb des Bereichs U + 0020 bis U + 007E enthält, ist die Zeichenfolge falsch formatiert. Wie kann ich das hinzufügen? Ich hätte das fraglich am Anfang hinzufügen sollen. Ich bin neu bei JS, und ich kämpfe seit Tagen damit ... – ZIvesic

Verwandte Themen