【问题标题】:Base64 Encoding Javascript to C#Base64 将 Javascript 编码为 C#
【发布时间】:2014-07-01 13:49:28
【问题描述】:

我正在尝试将一些 Javascript 移植到 C#,但遇到了一些麻烦。我正在移植的 javascript 调用这个

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

out 是一个数字数组。我知道它正在获取数字并使用 fromCharCode 将字符添加到字符串中。起初我不确定我的 C# 等效 btoa 是否正常工作,但我遇到的唯一问题是前 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;
}

两者都适用于字符串后面的字符,但不是开头。我已经研究过,但我不知道我错过了什么。

我的数字数组如下:{ 10, 135, 3, 10, 182, ....}

我知道 10 是换行符,3 是文本结尾,182 是 ¶,但令我困惑的是 135 应该是双匕首‡。当我打印字符串时,Javascript 不显示它。

所以最终发生的事情是当字符串转换为 Base64 时,我的字符串看起来像 Cj8DCj8CRFF.... 而 Javascript 字符串看起来像 CocDCrYCRFF.... 其余字符串是相同的,使用的 int 数组是一样的。

有什么想法吗?

【问题讨论】:

标签: c# javascript arrays string base64


【解决方案1】:

了解二进制数据并不总是代表给定编码中的有效文本,并且某些编码具有可变数量的字节来表示不同的字符,这一点很重要。简而言之:二进制数据和文本根本不是一回事,在某些情况下,只有遵循清晰、准确的规则,才能在两者之间进行转换。处理不当会导致疼痛。

也就是说,如果你有一个ints 列表,它总是在 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 encoding,除非您需要它来匹配 JS 的实现。

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

JS 使用的编码似乎与bytechar 之间的转换相同(chars > 255 无效),这不是可用的标准Encodings 之一。

以下是您可以如何组合原始数字和字符串,然后将其转换为 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);
}

【讨论】:

  • 你是救生员。将它转换为字节就是它所需要的。我从 int 转换为 char 一定不能与前 7 个字符一起使用。非常感谢!
猜你喜欢
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多