簡體   English   中英

Base64將Javascript編碼為C#

[英]Base64 Encoding Javascript to C#

我正在嘗試將一些Javascript移植到C#,但遇到了一些麻煩。 我要移植的JavaScript將此稱為

var binary = out.map(function (c) {
    return String.fromCharCode(c);
}).join("");
return btoa(binary);

out是一個數字數組。 我知道這是采用數字並使用fromCharCode將字符添加到字符串中。 最初,我不確定btoa的C#等價物是否正常工作,但是我遇到的唯一字符是前6個或8個。我的編碼字符串輸出的字符與前幾個字符相同。

起初,我在C#中是這樣做的

String binary = "";
foreach(int val in output){
    binary += ((char)val);
}

然后我嘗試

foreach(int val in output){
   System.Text.ASCIIEncoding convertor = new System.Text.ASCIIEncoding();
   char o = convertor.GetChars(new byte[] { (byte)val })[0];
   binary += o;
}

兩者都可以在String的后面的字符上正常工作,但不能在開始時工作。 我已經研究過,但不知道自己缺少什么。

我的數字數組如下:{10,135,3,10,182,....}

我知道10是換行符,3是文本結尾,182是¶,但令我感到困惑的是135應該是雙匕首‡。 當我打印字符串時,Javascript不顯示它。

所以最終發生的是,當字符串轉換為Base64時,我的字符串看起來像Cj8DCj8CRFF...。而Javascript字符串看起來像CocDCrYCRFF...。其余的字符串是相同的,並且使用的int數組是相同的。

有任何想法嗎?

重要的是要理解二進制數據並不總是以給定的編碼表示有效文本,並且某些編碼具有可變數量的字節來表示不同的字符。 簡而言之:二進制數據和文本根本不一樣,在某些情況下,並且要遵循明確,准確的規則,您只能在兩者之間進行轉換。 不正確地治療它們會引起疼痛。

就是說,如果您有一個int列表,它們始終在0-255范圍內,則應該成為base64字符串,這是一種處理方法:

var output = new[] { 0, 1, 2, 68, 69, 70, 254, 255 };
var binary = new List<byte>();
foreach(int val in output){
    binary.Add((byte)val);
}
var result = Convert.ToBase64String(binary.ToArray());

如果您有應被編碼為base64字符串的文本...通常,我建議您使用UTF8 編碼 ,除非您需要它來匹配JS的實現。

var str = "Hello, world!";
var result = Convert.ToBase64String(Encoding.UTF8.GetBytes(str));

JS使用的編碼似乎與在bytechar之間進行強制轉換( char > 255無效)相同,這不是可用的標准Encoding之一。

這是將原始數字和字符串組合在一起,然后將其轉換為base64的方法。

checked // ensures that values outside of byte's range do not fail silently
{
    var output = new int[] { 10, 135, 3, 10, 182 };
    var binary = output.Select(x => (byte)x)
           .Concat("Hello, world".Select(c => (byte)c)).ToArray();

    var result = Convert.ToBase64String(binary);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM