0

Web ページで、Javascript を使用して文字列を Base64 に変換しています。

<script type="text/javascript">
    function base64_encode (data) {
    var b64 = ""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
    ac = 0,
    enc = """",
    tmp_arr = [];
    if (!data) { return data; }
    do { 
        o1 = data.charCodeAt(i++);
        o2 = data.charCodeAt(i++);
        o3 = data.charCodeAt(i++);
        bits = o1 << 16 | o2 << 8 | o3;
        h1 = bits >> 18 & 0x3f;
        h2 = bits >> 12 & 0x3f;
        h3 = bits >> 6 & 0x3f;
        h4 = bits & 0x3f;    
        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
    } while (i < data.length);
    enc = tmp_arr.join('');
    var r = data.length % 3;
    return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
}
</script>

それはここからのコードです: http://phpjs.org/functions/base64_encode/

上記のコードを使用して文字列を base64 エンコードするcatと、Y2F0.

Powershell/.NET で同じ単語をエンコードすると、次のようになります。

PS C:\> [System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes("cat"))
YwBhAHQA

それらが異なるのはなぜですか? Javascript 関数を .NET 出力と一致させるにはどうすればよいですか?

4

2 に答える 2

2

base64 はバイナリ データをエンコードします。'cat' のバイナリ表現は、JS (UTF-8 エンコードの可能性が最も高い) と .NET (Unicode 16 ビット エンコード) で異なるため、base64 エンコーディングは必然的に異なります。

文字列を .NET で UTF-8 (byte[]) に変換してから、エンコードしてみてください。

于 2013-04-09T17:15:42.587 に答える
1

文字列を base64 に変換するには、まず文字をバイトにエンコードする必要があります。

Unicode は文字ごとに 2 バイトを使用して文字をエンコードしますが、貼り付けた JavaScript エンコーダーは、data既にバイト (または少なくとも ASCII) にエンコードされていると想定します。

Powershell スクリプトUTF8.GetBytesの代わりに使用してみてください。Unicode.GetBytesUTF-8 は、可能な場合は文字に 1 バイトを使用し、必要に応じて複数のバイトを使用します。

于 2013-04-09T17:15:02.317 に答える