替换 Base64 - http/https 通信是否 8 位干净
Replacing Base64 - Is http/https communication 8 bit clean?
以下是8位清洁含义的概述。
在 Web 应用程序的上下文中,为什么图像保存为 Base64?与 8 位清洁相关的开销为 33%。
如果传输方法是安全的,则无需这样做。
但基本上,我的图像保存在服务器上的 Base64 中,并传输到客户端,众所周知,客户端可以读取 Base64。
这是 SO 帖子中 Base 64 的客户端版本。
如何在 JavaScript 中将字符串编码为 Base64?
http/https 8 位干净吗?
参考
http://www.princeton.edu/~achaney/tmve/wiki100k/docs/8-bit_clean.html
http://en.wikipedia.org/wiki/8-bit_clean
你在问两件不同的事情。
-
问:http 8 位干净吗?
答:是的,HTTP是"位8干净"。
-
问:在 Web 应用程序的上下文中,为什么图像保存为 Base64?
答:图像通常不会保存在 Base64 中。事实上,它们几乎从不。它们通常以压缩二进制格式(PNG 或 JPG 或类似格式)保存、传输或流式传输
Base64 用于在 HTML 中嵌入图像。
所以,你得到了一个图像logo.png
.您可以将其静态包含在页面中,作为<img src='logo.png'>
。图像以二进制方式通过HTTP传输,在浏览器和服务器端都没有编码。这是最常见的情况。
或者,您可以决定将图像的内容嵌入到 HTML 中。它有一些优点:浏览器不需要第二次访问服务器来获取图像,因为浏览器已经在HTML文件的同一HTTP GET响应中收到了它。但有一些缺点,因为HTML文件是文本,并且某些字符值可能对HTML(而不是HTTP)具有特殊含义,因此不能只将二进制值嵌入HTML文本中。您必须对它们进行编码以避免此类冲突。最常用的编码方法是 base64,它仅以 33% 的开销避免所有冲突。
RFC 2616s 摘要指出:
HTTP 的一个功能是数据表示的类型和协商,允许独立于正在传输的数据构建系统。
HTTP 始终以纯文本标头开头,并在此标头中指定内容类型。只要发送方和接收方同意此内容类型,一切皆有可能。
HTTP依赖于可靠的(识别文字游戏)传输层,如TCP。HTTPS 仅增加传输层(或传输层和 HTTP 之间的安全性,不确定这一点)。
所以是的,http(s)是8位干净的。
除了 PA 的回答和您的问题"但是,当您不需要它时,为什么要使用增加 33% 开销的编码方法?":因为这是不同概念的一部分!
HTTP传输任何类型的数据,http内容可以是带有嵌入图片的html文件。但是在收到该 html 文件后,浏览器或其他渲染器必须解释 html 内容。这遵循不同的标准,这些标准需要对任意数据进行编码。HTML不是8位干净的,事实上它甚至不是7位干净的,因为对使用的字符及其出现顺序有很多限制。
在 Web 应用程序的上下文中,为什么图像保存为 Base64? 与 8 位清洁相关的开销为 33%。
Base64 用于允许 8 位二进制数据在 ASCII 定义中显示为可打印文本。这只是 7 位,而不是 8 位,因为最后 128 个字符将取决于集合编码(Latin1、UTF8 等),这意味着如果在客户端/接收端设置了不同的编码类型,则编码数据可能会被破坏源。
由于 ASCII 中没有足够的可打印字符来表示所有 8 位值(具有绝对值并且不依赖于编码本身),因此您需要"冲洗掉位",并且 base-64 保持足够高的数字以使字节能够表示为可打印字符。
这是您看到的 33% 开销,因为表示可打印范围之外的字符的字节值必须移动到可在 ASCII 表中打印的值;Base-64允许这样做(你也可以使用过去常见的可打印引用,即Usenet,电子邮件等)。
我正在考虑编写另一种编码类型来消除开销。
祝你好运:-)
与查询相关
- HTTP 8位干净吗?
HTTP协议不完全是8位干净的协议。
HTTP 实体正文是 8 位干净的,因为有一个建议内容类型的规定,允许在此线程中的每个人指出的交互实体之间进行内容协商。
但是请求行、标头和状态行不是 8 位干净的。
为了发送任何二进制信息作为
-
请求行,作为查询参数/路径段的一部分
-
页眉
必须使用二进制到文本编码之一来保留二进制值。
例如,当发送签名作为查询参数或标头的一部分时,这是CDN采用的签名URL技术的情况,签名二进制信息必须被编码以保留它的二进制值。
- 访问布局信息是否也会导致浏览器重排
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 如何检测是否有溢出
- jQuery中是否内置了任何字符串格式化函数
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 测试索引值是否等于某个数字的倍数
- Fancybox是否将Click事件静音
- 主干-不管怎样,检查事件以前是否绑定过
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- 是否可以使用Angular与PHP进行通信
- 是否可以与位于不同于html5网站呈现的服务器的网络套接字进行通信
- 使用phonegap,安卓设备是否有办法与PHP通信
- PostMessage API 是否可用于与 Android WebView 通信
- 是否有在C++和Javascript中实现的高级进程间通信API
- 替换 Base64 - http/https 通信是否 8 位干净
- 是否可以或不写一个Chrome扩展与专用服务器通信
- 通过web服务进行的通信在不同浏览器上的JavaScript之间是否标准化
- 是否可以在浏览器窗口之间进行基于事件的通信