6

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

Base64 字符串可以包含制表符吗?

4

9 回答 9

16

这取决于你在问什么。如果您询问制表符是否可以使用 base-64 编码,那么答案是“是”,因为它们可以被视为与任何其他 ASCII 字符相同。

但是,如果您询问 base-64 输出是否可以包含制表符,那么答案是否定的。以下链接是一篇详细介绍 base-64 的文章,包括哪些字符被认为是有效的:

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

于 2008-11-12T21:40:46.087 回答
9

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

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

这包括标签。

于 2008-11-12T21:36:09.137 回答
3

来自wikipedia.com:

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

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

于 2008-11-12T21:43:05.690 回答
2

当然。Tab 只是 ASCII 字符 9,它与任何其他整数一样具有 base64 表示。

于 2008-11-12T21:33:20.080 回答
1

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


在解释基本编码数据时,如果编码数据包含基本字母表之外的字符,则实现必须拒绝编码
数据,除非引用本文档的规范另有明确说明。此类规范可能会像 MIME 所做的那样声明,在解释数据时应该简单地忽略基本编码字母表之外的字符(“在你接受的内容上保持自由”)。请注意,这意味着任何相邻的回车/换行 (CRLF) 字符构成“非字母字符”并被忽略。

PEM ( RFC 1421 ) 和 MIME ( RFC 2045 ) 等规范指定 Base64 字符串可以由空格分隔。根据引用的RFC 822,制表符 (HTAB) 被视为空白字符。

因此,当在 MIME 或 PEM(可能还有其他类似规范)的上下文中使用 Base64 时,应在解码编码内容时处理(去除)空格,包括制表符。

于 2008-11-12T21:44:01.307 回答
1

哈哈,从回复中可以看出,这其实不是一个简单的yes no 答案。

转换后生成的 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());
}
于 2008-11-12T21:53:19.540 回答
0

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

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 中的字符以外的字符、换行符和其他空格可能表示传输错误,在某些情况下可能适合发出警告消息甚至消息拒绝。

于 2008-11-12T21:32:29.847 回答
0

是的!

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

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

Data: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
URLs: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_

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

于 2009-01-31T00:23:08.757 回答
0

这里似乎有很多混乱;令人惊讶的是,大多数答案都是“否”。我认为这不是一个很好的规范答案。造成混淆的原因可能是 Base64 没有严格规定;存在多种实际实现和解释。您可以查看链接文本以进行更多讨论。

然而,一般来说,符合 base64 的编解码器应该理解换行符,因为它们是由一些 base64 定义(76 个字符段,然后是换行符等)强制要求的。正因为如此,大多数解码器还允许缩进空白,以及非常常见的 4 字符“三元组”之间的任何空白(如此命名,因为它们编码 3 个字节)。

所以很有可能在实践中你可以使用制表符和其他空白。

但是,如果生成发送到服务的 base64 内容,我不会自己添加标签——对你发送的内容要保守,在你收到的内容上(更)自由。

于 2009-04-02T18:29:21.010 回答