2016-05-23 7 views
0

Ich schreibe einen Client-Side-Code in JS, die mit einem C# -Service von Drittanbietern kompatibel sein sollte, die ich überhaupt nicht ändern kann.kodieren Sie Basis 64 in Javascript, entschlüsseln Unicode in C#

Der Dienst liefert ein Base64 Unicode codierte Zeichenfolge (a JSON), zum Zwecke des (vereinfachtes) Beispiel Dies ist der C# Code:

var myString = Encoding.Unicode.GetBytes("{\"counter\":0}"); 
var encodedString = Convert.ToBase64String(myString); 

was dazu führt: "ewAiAGMAbwB1AG4AdABlAHIAIgA6ADAAfQA ="

jetzt brauche ich auf der Client-Seite dieses codierte JSON zu aktualisieren, und geben eine gültige base64 Zeichenfolge, die durch diese C# Code dekodiert werden:

byte[] bytes = Convert.FromBase64String(encodedString); 
string decodedString = Encoding.Unicode.GetString(bytes); 

Alle Lösungen/Beispiele, die ich online gefunden habe, führten zu den Decodierungsfunktionen, um ein ungültiges Ergebnis auszugeben. zum Beispiel, wenn Sie die grundlegende window.btoa("{\"counter\":1}") in eyJjb3VudGVyIjoxfQ== Ergebnis, die wiederum, wenn die Entschlüsselung auf der C# -App, wird verursachen eine Format Ausnahme bestenfalls, oder führen zu insgesamt Kauderwelsch.

irgendwelche Ideen?

+2

Wenn Sie 'window.btoa' verwenden, verwendet es die UTF8-Codierung, wenn Sie versuchen, es als Unicode-Zeichenfolge zu dekodieren, wird es natürlich als Kauderwelsch enden. Der C# -Konvertierungscode macht Spaß, aber wenn Sie ihn nicht als Unicode-Eingabe angeben, stürzt er natürlich ab, wenn Sie 'Encoding.Unicode.GetString' ausführen. Was passiert, wenn Sie im C# -Code "Unicode" in "UTF8" ändern? –

+0

Zur Verdeutlichung bedeutet Unicode unter Windows (und C#) UTF16-LE. Sie müssen herausfinden, wie man eine Zeichenkette, die als UTF-16 codiert ist, in Javascript erhält. – roeland

+0

Nun, wenn ich es zu "Encoding.UTF8" ändern, dann funktioniert die Decodierung gut. Aber wenn ich es in 'Encoding.UTF16' ändere, stürzte es ab. Das Problem ist, dass ich keine Kontrolle über den C# -Code habe, ich muss es auf der JS-Seite herausfinden - –

Antwort

1

Wie @roeland erwähnt, ist der "Trick", zuerst die Zeichenfolge nach UTF16-LE zu codieren und dann die UTF16-LE-Zeichenfolge nach base64 zu codieren.

So wie ich gelöst habe, ist es, indem man zuerst den String in ein Byte-Array Umwandlung mit:

function str2ByteArr(str) { 
    var bytes = []; 

    for (var i = 0; i < str.length; ++i) { 
     bytes.push(str.charCodeAt(i)); 
     bytes.push(0); 
    } 
    return bytes; 
} 

das Ergebnis für "{\"counter\":0}" sein wird:

[123, 0, 34, 0, 99, 0, 111, 0, 117, 0, 110, 0, 116, 0, 101, 0, 114, 0, 34, 0, 58, 0, 48, 0, 125, 0] 

und dann das Array Umwandeln base64:

function arrayBufferToBase64(buffer) { 
    var binary = ''; 
    var bytes = new Uint8Array(buffer); 
    var len = bytes.byteLength; 
    for (var i = 0; i < len; i++) { 
     binary += String.fromCharCode(bytes[i]); 
    } 
    return window.btoa(binary); 
} 

und alles zusammenfassen:

var byteArr = str2ByteArr(str); 
return arrayBufferToBase64(byteArr); 

das Ergebnis:

"ewAiAGMAbwB1AG4AdABlAHIAIgA6ADAAfQA=" 

eine andere Weise, die ich gefunden habe, für 'utf-8', 'utf-16BE' und 'utf-16LE' encoding String in Byte-Arrays konvertieren von Text.Encoder mit dem Sie die Codierung explizit wie so wählen:

var textEncoder = new TextEncoder('utf-16le') 
textEncoder.encode("{\"counter\":0}") 

aber dies wird nicht durch Explorer unterstützt.

Verwandte Themen