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.
['String.fromCharCode()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode) – Pointy
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
Daten, die an die Funktion übergeben werden (per Spezifikation), sind Strings. – ZIvesic