Base64字符串可以包含选项卡吗?

时间:2008-11-12 21:29:02

标签: c# .net base64

简单的是或否问题,我90%肯定它不是......但我不确定。

Base64字符串可以包含标签吗?

9 个答案:

答案 0 :(得分:15)

这取决于你的要求。如果您询问制表符是否可以进行base-64编码,则答案为“是”,因为它们可以与任何其他ASCII字符一样对待。

但是,如果您询问base-64输出是否可以包含选项卡,则答案为否。以下链接用于详细介绍base-64的文章,包括哪些字符被视为有效:

http://en.wikipedia.org/wiki/Base64

答案 1 :(得分:9)

简短的回答是否定的 - 但Base64也不能包含回车符。

这就是为什么,如果你有多行Base64,你可以去掉任何回车,换行符以及任何不在Base64字母表中的东西

包括标签。

答案 2 :(得分:3)

来自wikipedia.com:

  

当前版本的PEM(指定   在RFC 1421中)使用64个字符   字母组成的上部和   小写罗马字母字符   (A-Z,a-z),数字(0-9)和   “+”和“/”符号。 “=”   符号也用作特殊符号   后缀代码。原本的   规范,RFC 989,另外   使用“*”符号来分隔编码   但输出中的未加密数据   流。

如您所见,标签字符不包括在内。但是,您当然可以将制表符编码为base64字符串。

答案 3 :(得分:2)

不确定。 Tab只是ASCII字符9,它具有base64表示,就像任何其他整数一样。

答案 4 :(得分:1)

Base64规范(RFC 4648)在Section 3.3中指出,除非另一规范明确允许,否则应拒绝任何遇到的非字母字符:

  

实现必须拒绝   编码数据,如果它包含
  基本字母表外的字符   在解释基数编码时   数据,除非规范   明确提到这份文件   另有说明。这样的规格   可以改为陈述,就像MIME那样,   基地外的人物   编码字母应该只是   在解释数据时忽略(“be   你所接受的自由主义者“)。    请注意,这意味着任何   相邻的回车/换行   (CRLF)字符构成   “非字母字符”并且是   忽略。

PEM(RFC 1421)和MIME(RFC 2045)等规范指定可以通过空格分解Base64字符串。每个引用的RFC 822,选项卡(HTAB)被视为空白字符。

因此,当Base64用于MIME或PEM(以及可能的其他类似规范)的上下文时,在解码编码内容时应处理(剥离)空白(包括制表符)。

答案 5 :(得分:1)

哈哈,正如你从回答中看到的那样,这实际上并非如此简单,是的,没有答案。

转换后产生的Base64字符串不能包含制表符,但在我看来,你不是在问我,你在问我能否代表一个包含Base64中的标签的字符串(转换前),以及答案是肯定的。

我想补充一点,你应该做的就是确保你注意保留字符串的编码,即用正确的编码将其转换为字节数组(Unicode,UTF-8无论如何)然后转换那个字节数组到base64。

编辑:一个简单的测试。

private void button2_Click(object sender, EventArgs e)
{
  StringBuilder sb = new StringBuilder();
  string test = "The rain in spain falls \t mainly on the plain";
  sb.AppendLine(test);
  UTF8Encoding enc = new UTF8Encoding();
  byte[] b = enc.GetBytes(test);
  string cvtd = Convert.ToBase64String(b);
  sb.AppendLine(cvtd);
  byte[] c = Convert.FromBase64String(cvtd);
  string backAgain = enc.GetString(c);
  sb.AppendLine(backAgain);
  MessageBox.Show(sb.ToString());
}

答案 6 :(得分:0)

.NET框架中的

Convert.FromBase64String()似乎并不介意它们。我相信字符串中的所有空格都会被忽略。

string xxx = "ABCD\tDEFG";   //simulated Base64 encoded string w/added tab
Console.WriteLine(xxx);
byte[] xx = Convert.FromBase64String(xxx); // convert string back to binary
Console.WriteLine(BitConverter.ToString(xx));

输出:

ABCD    DEFG
00-10-83-0C-41-46

RFC-2045(6:8)的相关条款

  

编码的输出流必须是   不再代表   每个超过76个字符。 全线   休息或其他字符不是   必须忽略表1中的发现   解码软件。在base64数据中,   除表中的字符以外的字符   1,换行,和其他白色   空间可能表示传输   错误,关于哪个警告   消息甚至消息拒绝   可能适合某些人   情况。

答案 7 :(得分:0)

YES!

Base64用于使用一组安全字符将ANY 8bit值(十进制0到255)编码为字符串。 TAB是十进制9。

Base 64使用以下字符集之一:

Data: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
URLs: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_

文本中的二进制附件(例如:电子邮件)也使用此系统进行编码。

答案 8 :(得分:0)

这里似乎有很多混乱;而且令人惊讶的是,大多数答案都是“不”的。我认为这不是一个好的规范答案。 混淆的原因可能是Base64没有严格规定;存在多种实际实现和解释。 您可以查看link text以获取更多相关信息。

但是,一般情况下,符合base64的编解码器应该理解换行符,因为它们是由一些base64定义(76个字符段,然后换行等)强制执行的。 因此,大多数解码器也允许缩进空格,并且通常在4个字符的“三元组”之间有任何空格(因为它们编码3个字节,因此命名)。

因此,实际上你可以使用制表符和其他空格。

但是如果生成发送给服务的base64内容,我自己就不会自己添加标签 - 对你发送的内容保守一点,(更多)自由接收你的内容。