[英]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使用的編碼似乎與在byte
和char
之間進行強制轉換( 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.