HTTP(或任何协议/系统)是 8 位干净的并不意味着您可以在协议中的任何位置简单地使用任何 8 位值。这仅意味着协议或系统能够在适当的情况下处理 8 位编码。
例如,HTTP 使用回车+换行符(十六进制值0D0A
)来分隔标头字段和消息正文,因此您不能在标头中的任何位置同时使用这些值。此外,标题和正文可能会根据其中包含的数据类型对其字符编码有限制。如果 HTTP Content-Type 设置为text/html; charset=utf-8
,则正文中的字符(例如<
(十六进制值3C
))将保留给 HTML 标记。HTTP 正文可能是 8 位干净的,但这并不意味着您可以在其中放入任何您想要的 8 位内容,您仍然必须符合 UTF-8(或其他一些编码)并遵守内容规则HTML 强加的。
Base64 的目的是对任意二进制数据进行编码,以便在其他编码方案中使用,其中字符以外[A-Za-z0-9+/]
的字符保留用于特殊用途,或者完全无效(例如在 HTML 中,或在 URL 查询字符串中)。您不能只用完整的 8 位编码方案替换 Base64,因为 8 位方案在需要 Base64 的情况下无效。即使您使用的协议本身是 8 位干净的,也是如此。
简而言之,无论您使用什么二进制编码方案,都不仅仅依赖于 8 位干净而不是 8 位干净。这取决于您在其中使用编码的协议、协议控制字符是什么以及在什么情况下保留这些字符。
更新:
如果您真正想做的只是在 HTTP 响应中返回原始二进制文件,只需将 HTTP Content-Type 设置为application/octet-stream
. 这将允许您在 HTTP 正文中返回任意二进制文件,而无需任何编码。