简单的是或否问题,我 90% 确定它不是……但我不确定。
Base64 字符串可以包含制表符吗?
这取决于你在问什么。如果您询问制表符是否可以使用 base-64 编码,那么答案是“是”,因为它们可以被视为与任何其他 ASCII 字符相同。
但是,如果您询问 base-64 输出是否可以包含制表符,那么答案是否定的。以下链接是一篇详细介绍 base-64 的文章,包括哪些字符被认为是有效的:
简短的回答是否定的——但 Base64 也不能包含回车。
这就是为什么,如果你有多行 Base64,你去掉任何回车、换行和任何不在 Base64 字母表中的东西
这包括标签。
当前版本的 PEM(在 RFC 1421 中指定)使用 64 个字符的字母表,由大写和小写罗马字母字符(A-Z、a-z)、数字 (0-9) 和“+ " 和 "/" 符号。“=”符号也用作特殊的后缀代码。原始规范 RFC 989 还使用“*”符号来分隔输出流中编码但未加密的数据。
如您所见,制表符不包括在内。但是,您当然可以将制表符编码为 base64 字符串。
当然。Tab 只是 ASCII 字符 9,它与任何其他整数一样具有 base64 表示。
Base64 规范 ( RFC 4648 ) 在第 3.3 节中声明,除非另一个规范明确允许,否则应拒绝任何遇到的非字母字符:
在解释基本编码数据时,如果编码数据包含基本字母表之外的字符,则实现必须拒绝编码
数据,除非引用本文档的规范另有明确说明。此类规范可能会像 MIME 所做的那样声明,在解释数据时应该简单地忽略基本编码字母表之外的字符(“在你接受的内容上保持自由”)。请注意,这意味着任何相邻的回车/换行 (CRLF) 字符构成“非字母字符”并被忽略。
PEM ( RFC 1421 ) 和 MIME ( RFC 2045 ) 等规范指定 Base64 字符串可以由空格分隔。根据引用的RFC 822,制表符 (HTAB) 被视为空白字符。
因此,当在 MIME 或 PEM(可能还有其他类似规范)的上下文中使用 Base64 时,应在解码编码内容时处理(去除)空格,包括制表符。
哈哈,从回复中可以看出,这其实不是一个简单的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());
}
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 中的字符以外的字符、换行符和其他空格可能表示传输错误,在某些情况下可能适合发出警告消息甚至消息拒绝。
是的!
Base64 用于使用一组安全字符将任何 8 位值(十进制 0 到 255)编码为字符串。TAB 是十进制的 9。
Base 64 使用以下字符集之一:
Data: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
URLs: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_
文本中的二进制附件(例如:电子邮件)也使用该系统进行编码。
这里似乎有很多混乱;令人惊讶的是,大多数答案都是“否”。我认为这不是一个很好的规范答案。造成混淆的原因可能是 Base64 没有严格规定;存在多种实际实现和解释。您可以查看链接文本以进行更多讨论。
然而,一般来说,符合 base64 的编解码器应该理解换行符,因为它们是由一些 base64 定义(76 个字符段,然后是换行符等)强制要求的。正因为如此,大多数解码器还允许缩进空白,以及非常常见的 4 字符“三元组”之间的任何空白(如此命名,因为它们编码 3 个字节)。
所以很有可能在实践中你可以使用制表符和其他空白。
但是,如果生成发送到服务的 base64 内容,我不会自己添加标签——对你发送的内容要保守,在你收到的内容上(更)自由。