0

在网页上,我使用 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 为每个字符使用两个字节对字符进行编码,而您粘贴的 JavaScript 编码器假定data已经编码为字节(或至少为 ASCII)。

尝试在您的 Powershell 脚本中使用UTF8.GetBytes而不是。Unicode.GetBytesUTF-8 将尽可能使用一个字节来表示字符,并在必要时使用多个字节。

于 2013-04-09T17:15:02.317 回答