繁体   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