2016-05-23 13 views
0

私はJSでクライアントサイドのコードを書いています。これは、私が一切変更できないサードパーティのC#サービスと互換性があります。javascriptでbase64をエンコードし、cでコードをデコード#

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

: "ewAiAGMAbwB1AG4AdABlAHIAIgA6ADAAfQA ="

サービスは、これはC#コードである(簡略化)実施例のためにbase64でユニコードエンコードされた文字列(JSON)、 を供給する

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

は、今私は、クライアント側では、このエンコードされたJSONを更新し、このC#のコードによってデコードされる有効なbase64文字列を返す必要があります

私がオンラインで見つけたすべてのソリューション/例は、デコード機能が無効な結果を出力する結果となりました。 たとえば、基本window.btoa("{\"counter\":1}")を使用した場合、eyJjb3VudGVyIjoxfQ== となり、c#アプリでのデコード時には、最高でフォーマット例外が発生するか、ぎこちなくなります。

どのようなアイデアですか?

+2

'window.btoa'を使うと、UTF8エンコーディングを使用します。ユニコード文字列としてデコードしようとすると、途方もないものになります。 C#変換コードは面白いですが、Unicode入力を与えなければ、 'Encoding.Unicode.GetString'を実行するとクラッシュしてしまいます。 C#コードで 'Unicode'を' UTF8'に変更するとどうなりますか? –

+0

明確にするため、Windows(およびC#)のUnicodeはUTF16-LEを意味します。あなたは、JavaScriptでUTF-16としてエンコードされた文字列を取得する方法を理解する必要があります。 – roeland

+0

もし 'Encoding.UTF8'に変更すれば、デコードはうまく動作します。 しかし、 'Encoding.UTF16'に変更するとクラッシュしました。問題は、私はC#コードを制御することができない、私はJS側でそれを把握する必要がある - –

答えて

1

@roelandと同様に、 "トリック"は、文字列をUTF16-LEに最初にエンコードし、次にUTF16-LE文字列をbase64にエンコードすることです。

私はそれが最初に使用してバイト配列に文字列を変換している解決しました方法:

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

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

結果"{\"counter\":0}"ためには次のようになります

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

した後に配列を変換しますベース64:

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

そして合計すると、

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

結果は次のとおりです。私は 'UTF-8'、 'UTF-16BE' と 'UTF-16LE' 符号化バイト配列に文字列を変換することが分かってきました

"ewAiAGMAbwB1AG4AdABlAHIAIgA6ADAAfQA=" 

別の方法がありますあなたが明示的にそうようにエンコーディングを選択することができますText.Encoderを使用して:

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

が、これは探検家によってサポートされていません。

関連する問題