Encoding 为什么要使用Base64?

Encoding 为什么要使用Base64?,encoding,utf-8,base64,Encoding,Utf 8,Base64,Base64编码在通过线路发送时将输入的大小增加约37%。如果是这种情况,为什么不使用UTF-8对内容进行编码(比如一个.jpg文件)。这样文件的大小就不会增加了,对吗 例如:如果我想发送字符串“asd”,UTF-8编码的版本将是3字节,而Base64编码的版本将是4字节,Base64通常在实例中用于以文本格式表示任意二进制数据,它有33.3%的开销,但这比说十六进制符号有50%的开销要好。 utf-8是一种文本编码,它不能表示jped文件中的任意二进制数据。 几乎没有或者根本没有理由将二进制数

Base64编码在通过线路发送时将输入的大小增加约37%。如果是这种情况,为什么不使用UTF-8对内容进行编码(比如一个.jpg文件)。这样文件的大小就不会增加了,对吗


例如:如果我想发送字符串“asd”,UTF-8编码的版本将是3字节,而Base64编码的版本将是4字节,Base64通常在实例中用于以文本格式表示任意二进制数据,它有33.3%的开销,但这比说十六进制符号有50%的开销要好。
utf-8是一种文本编码,它不能表示jped文件中的任意二进制数据。
几乎没有或者根本没有理由将二进制数据转换为文本,通过网络传输,所以很多时候人们这样做是因为他们不知道什么更好。
使用Base64的唯一原因是如果您从API或库中获得它。

Base64的目的是允许二进制数据通过通信通道传输,而不能依靠通信通道端到端传输所有可能的字节值。特别是,在128和255之间的字节值无法轻松可靠地传输的情况下,使用Base64

相反,UTF-8用于跨通道对Unicode进行编码,可以假定该通道端到端可靠地传输所有可能的字节值(有时称为“8位干净”通道)

所以,你的建议有两个问题。首先,JPEG是二进制数据,而不是Unicode,因此UTF-8并不真正合适:如果以明显的方式“将JPEG编码为UTF-8”(将JPEG视为字节序列,每个字节与U+00到U+FF之间的Unicode码点相关联,然后将这些码点编码为UTF-8),则所有字节值的大小将从128到255翻一番,因此,文件大小平均会增加50%。其次,即使您这样做了,生成的编码JPEG也需要一个8位干净的通信通道,因此它不能用于需要Base64的情况


编辑:在一条评论中,你问我们是否不能使用“输入二进制->7位ASCII编码->有线发送”来节省空间。我想你的意思是把输入的二进制文件作为一个长的比特流,把它们分成7位的块,然后以ASCII码的形式发送?是的,这是可以做到的,只会增加14%的大小,但引起问题的不仅仅是非ASCII字节值128-255。在最常用Base64的MIME电子邮件中,不同平台之间的行尾约定(回车、换行或组合)的差异、标准中规定的某些历史行长限制等意味着并非所有ASCII字符(字节0-127)都可以安全使用。Base64不是兼容性和效率之间的最佳折衷方案,但它非常接近。

“Base64通常在实例中用于以文本格式表示任意二进制数据”。但最终文本也会以0和1的形式通过网络发送。我的想法是避免33%的开销,当有任意二进制数据作为输入时,将每8位编码为相应的ASCII字符,而不是6位编码。这样我们可以避免尺寸的增加。这不对吗?您是否假设base64是在通过网络发送数据之前对数据进行编码的标准。我不太确定你想弄明白什么。ascii也是7位的。是的,ascii是7位的。我的错。Base64是一种标准,在许多地方用于在发送图像之前对图像进行编码。如果它导致尺寸显著增加,那么为什么要使用它?我假设转换是这样工作的:(输入二进制)-->ASCII-->Base64编码字符串-->有线发送。相反,如果我们使用:(input binary)-->ASCII-->通过有线发送,则不会增加大小开销。Base64是许多地方用于在发送图像之前对图像进行编码的标准。这是很久以前通过AJAX发送到文件的,现在不再需要了,因为AJAX支持文件上传。因此,我们使用(输入二进制)->通过网络发送(不转换数据)。您可能会发现以下Wikipedia链接有助于解释其中一些概念:。请注意,Base64用于编码电子邮件中发送的图像,但仅此而已。这样做是出于历史和合法的兼容性原因——如果附件是以“纯二进制”格式发送的,许多电子邮件系统会损坏附件。从技术上讲,Web服务器可以在Base64中发送图像,但从来不会这样做——它们只发送原始二进制流。在通过网络发送之前,转换JPEG文件(二进制数据)的确切过程是什么?我假设它是(输入二进制)-->8位ASCII-->Base64编码字符串-->最终作为二进制通过线路发送的;ASCII是一种7位编码。所以,它只是“输入二进制(允许任何字节值)->Base64编码->输出二进制(只允许字节值的子集)”。实际上,在这种情况下,输出二进制也是ASCII,因此您可以编写“输出ASCII”。如果我们这样做:“输入二进制->7位ASCII编码->通过有线发送”,我们可以减少大小开销的增加,对吗?@user3282666“在通过有线发送之前转换JPEG文件(二进制数据)”:这取决于上下文。在HTTP中,字节可以按原样发送,在一个表示主体是JPEG的头之后,并可以选择指定字节数。这个答案的两个部分对我来说没有意义。(1) 您说128-255的值将是原来的两倍。为什么?UTF-8的目的不就是让255个字符适合8个字节吗?U+00至U+FF为255种可能性。(2) 你暗示沟通渠道不是“8位干净的”。这意味着什么?为什么他们不会这样?我们不是以字节的形式发送数据吗?