我有点困惑人们如何表示二进制数据,以及它是如何通过网络发送的。我将通过维基百科的例子来解释。此处显示< - https://imgur.com/a/POELH - >所以我的二进制数据编码为base 64,我发送文本TWFU。所以我发送T然后W然后F和最后U.但是发送T,一个字符。我需要一个字节来发送它,就像我一直被告知的那样。通过网络发送的一个字符是一个字节。
因为现在我开始认为如果我编码24个字节,我将发送超过4个字符,但是要发送超过4个字符,我需要与字符数相同的字节数?
因此,当从上面的示例中通过网络"Man" (unencoded) (Requiring 3 bytes normally)
vs "TWFu" (encoded) (requiring 4 bytes normally)
发送时,通过网络发送的相同比特序列是相同的。因为我上次使用套接字发送数据时,他们只是要求输入字符串,而不是文本+编码输入。
答案 0 :(得分:2)
概要:“如何”是协议。 “原始”很常见。
数据以发件人和收件人同意的方式发送。有许多协议是标准协议。议定书在许多层面上运作。覆盖两个级别的非常常见的对是TCP / IP。许多更高级别的协议都在它们之上。 (更高级别的协议可能依赖于也可能不依赖于特定的底层协议。)HTTP和SMTP是非常常见的高级协议,通常将SSL夹在中间。
有时,层或实现它们的软件称为堆栈。还有引用(或概念)OSI Model。关键是它提供了一种语言来讨论不同的层。它定义的图层可能会也可能不会映射到任何特定的堆栈。
你的问题太模糊了,无法直接回答。使用HTTP,“原始”二进制数据始终传输。 HTTP标头可以以八位字节为单位给出正文的长度,并且正文跟随标题。作为发送方和接收方之间协议的一部分,标头可能会使用MIME标头提供有关二进制数据的元数据。例如:你的gravatar 的标头包含:
content-length:871
content-type:image/png
这足以让接收方知道发送方声称它是871字节的PNG图形。接收器将读取标头,然后为主体读取871个字节,然后假设接下来是另一个HTTP标头。
某些协议使用除了具有预先声明的大小的主体之外的同步方法。它们可能完全基于文本,并使用仅允许某些字符的语法。它们可以通过嵌套协议进行扩展,以使用Base64之类的东西将二进制数据表示为文本。
某些层可能提供足够密度的数据压缩,因此较高层(例如Base64)的扩展不是一个很大的问题。例如,请参阅HTTP Compression。
如果要查看HTTP的运行情况,请按F12并转到“网络”选项卡。如果您想在计算机上看到其他协议处于活动状态,请尝试WireShark,Microsoft Message Analyzer,Fiddler或类似协议。
答案 1 :(得分:1)
Base64是一种在纯7位通道中编码任意8位数据的方法。互联网基于8位字节的原则,对于文本模式,除非另有说明,否则它被假定为7位ASCII。
如果您要发送Base64编码的数据,那么您将真正发送TWFU
。许多基于文本的协议使用Base64是为了方便:它是一个既定标准,对大多数应用程序来说都足够高效。
互联网的基础IP是一种基于8位字节的协议。发送二进制数据时,您可以充分利用所有8位,但如果您正在使用文本模式协议,其中有很多,您通常会使用7位ASCII,除非协议有一种方法可以指定您正在使用的字符集或编码。
如果您可以选择切换到"二进制文件"转移然后你可以支持Base64的需要。如果您正在使用7位ASCII协议,那么您可能需要使用Base64。
请注意,这不是编码任意二进制字符的唯一方法。还有quoted printable用于电子邮件,URI encoding用于网址。这些在逃避异常的情况下效率更高,但如果每个角色都需要,则效率低得多。
答案 2 :(得分:0)
如果您知道自己只处理7位文本,则不需要进行base-64编码。
但是,如果您需要发送
Man
Boy
在纯粹的7位频道上,您无法通过换行符将其作为文字发送。相反,您要在base 64中发送编码
TWFuDQpCb3kNCg==
已编码换行符但不使用不兼容的字符。当然,接收者需要知道您正在发送编码文本 - 无论是使用的协议暗示还是以某种方式明确标记。