2013-04-09 16 views
0

在網頁中,我使用JavaScript字符串爲Base64轉換:爲什麼使用Powershell/.NET和Javascript爲同一個字符串獲取不同的base64編碼?

<script type="text/javascript"> 
    function base64_encode (data) { 
    var b64 = ""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/=""; 
    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輸出相匹配?

回答

1

爲了將字符串轉換爲base64,必須首先將字符編碼爲字節。

Unicode對每個字符使用兩個字節的字符進行編碼,而您粘貼的JavaScript編碼器假定data已經被編碼爲字節(或者至少是ASCII)。

在您的Powershell腳本中嘗試使用UTF8.GetBytes而不是Unicode.GetBytes。在可能的情況下,UTF-8將使用一個字節的字符,並在必要時使用多個字節。

+0

使用UTF8.GetBytes的竅門。 – 2013-04-09 17:20:01

2

base64編碼二進制數據。 'cat'的二進制表示在JS(最可能是UTF-8編碼)和.NET(Unicode 16位編碼)方面有所不同,因此base64編碼必然有所不同。

嘗試在.NET中將字符串轉換爲UTF-8(byte []),然後進行編碼。

+0

當...你們都在同一時間回答,你們都是正確的......誰給綠色複選標記...... – 2013-04-09 17:21:03

+0

你選擇了正確的:cdhowie解釋得更清楚。 – 2013-04-09 18:50:35

相關問題