维基百科说
当需要对二进制数据进行编码时,通常需要使用Base64编码方案,该二进制数据需要在旨在处理文本数据的媒体上存储和传输。这是为了确保数据在传输过程中保持不变。
但是,不是因为我们的机器存储的内存中始终以二进制形式存储/传输数据,而是仅以二进制形式存储/传输数据吗?因此,无论您编码位模式010011010110000101101110
为Man
ASCII或如TWFu
为Base64,你最终将存储相同的位模式。
如果最终编码是用零和一表示的,并且每台机器和媒体都可以处理它们,那么将数据表示为ASCII还是Base64有什么关系呢?
“旨在处理文本数据的媒体”是什么意思?他们可以处理二进制=>他们可以处理任何东西。
谢谢大家,我想我现在明白了。
当我们发送数据时,我们不能确定数据将以我们期望的格式解释。因此,我们发送双方都可以理解的以某种格式编码的数据(例如Base64)。这样,即使发送方和接收方对相同内容的解释不同,但由于它们在编码格式上达成共识,因此不会错误地解释数据。
以Mark Byers为例
如果我想发送
Hello
world!
一种方法是像ASCII一样发送
72 101 108 108 111 10 119 111 114 108 100 33
但是字节10可能无法在另一端正确解释为换行符。因此,我们使用ASCII子集对它进行编码,如下所示
83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61
即使在接收器碰巧对其余字符集有不同的解释的情况下,这样做也会以相同数量的信息传输更多数据为代价,从而确保接收器可以按预期方式解码数据。
您的第一个错误是认为ASCII编码和Base64编码可以互换。他们不是。它们用于不同的目的。
要了解为什么首先需要Base64,我们需要一些计算历史。
计算机以二进制形式(0和1)进行通信,但是人们通常希望与更丰富的表单数据(例如文本或图像)进行通信。为了在计算机之间传输此数据,首先必须将其编码为0和1,然后发送,然后再次解码。以文本为例-
有许多不同的方法可以执行此编码。如果我们都可以同意一个编码,那就简单得多了,但不幸的是事实并非如此。
最初,创建了许多不同的编码(例如Baudot码),每个字符使用不同的位数,直到最终ASCII成为每个字符7位的标准。但是,大多数计算机将二进制数据存储在每个字节由8位组成的字节中,因此ASCII不适合传输此类数据。有些系统甚至会擦除最高位。此外,跨系统的行尾编码的差异意味着有时还会修改ASCII字符10和13。
为了解决这些问题,引入了Base64编码。这样,您就可以将ribribry字节编码为已知可以安全发送而不损坏的字节(ASCII字母数字字符和几个符号)。缺点是使用Base64编码消息会增加其长度-每3个字节的数据会编码为4个ASCII字符。
发送文本可靠,你可以 先 编码,使用您的选择(例如UTF-8),然后的文本编码字节 后
的Base64编码生成的二进制数据转换为文本字符串,它是安全发送编码为ASCII。接收者将不得不逆转此过程以恢复原始消息。当然,这要求接收者知道使用了哪种编码,并且该信息通常需要单独发送。
从历史上看,它已用于对电子邮件中的二进制数据进行编码,其中电子邮件服务器可能会修改行尾。一个更现代的示例是使用Base64编码将图像数据直接嵌入HTML源代码中。在这里,有必要对数据进行编码,以避免像“ <”和“>”这样的字符被解释为标签。
这是一个工作示例:
我希望发送一条两行的短信:
你好
世界!
如果我以ASCII(或UTF-8)格式发送,则将如下所示:
72 101 108 108 111 10 119 111 114 108 100 33
字节10在某些系统中已损坏,因此我们可以将这些字节以64为基数编码为Base64字符串:
SGVsbG8sCndvcmxkIQ ==
使用ASCII编码时,如下所示:
83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61
这里的所有字节都是已知的安全字节,因此任何系统几乎都不会破坏此消息的机会。我可以发送此消息而不是原始消息,然后让接收者撤消该过程以恢复原始消息。
问题内容: 我是一个完整的初学者。 我已阅读了有关解决方案的Google文档。我在互联网上搜索了同样的内容。 但。一切似乎都是技术性的。 据我了解,.Flush有助于在功能出现时立即执行这些功能,而无需将它们捆绑在一起。 我对吗? 如果不是的话,外行人的含义是什么?并请举一个简单的例子。谢谢。 问题答案: 程序员在希望确保在继续之前将先前代码的输出和/或效果写入电子表格时会使用。如果您不这样做,则
问题内容: 据我所知,以下两个代码段将达到相同的目的。为什么有块呢? 代码A: 代码B: 问题答案: 如果您未处理的异常被抛出会怎样?(我希望你不会抓到…) 如果从try块内部返回会怎样? 如果catch块引发异常会怎样? 一个代码块确保 无论 您退出该代码块(以几种方式明确地中止整个过程),该代码块都将被执行。这对于确定性清除资源很重要。
问题内容: 我开始使用RxJS,但我不明白为什么在此示例中我们需要使用类似or 的函数;数组的数组在哪里? 如果有人可以直观地解释正在发生的事情,那将非常有帮助。 问题答案: 当您有一个Observable的结果是更多Observable时,可以使用flatMap。 如果您有一个由另一个可观察对象产生的可观察对象,则您不能直接过滤,缩小或映射它,因为您有一个可观察对象而不是数据。如果您生成一个可观
问题内容: 它为什么如此重要?根据XML映射的优势是什么?你能解释这些吗?谢谢。 问题答案: 它不是“强制性”中的重要内容。有优势和劣势的可能性是不同的。 优点: 编译时检查:如今在IDE中,用Java(而不是Xml)编写非常易于使用。启动应用程序(渐进式编译)时,没有发现 更多错别字 ,也没有什么值得记住的( 完成 )… 使用代码进行本地化(类级别):不必打开两个文件(java和xml)以获取完
问题内容: 基数实际上是什么意思?我们为什么需要它? 问题答案: 您可能并不总是希望将整数解析为以10为底的数字,因此提供基数可以指定其他数字系统。 基数是一位数字的值数。十六进制为16。八进制为8,二进制为2,依此类推… 在该函数中,您可以执行一些操作来提示基数而不提供基数。如果用户输入的字符串与其中一个规则匹配,但没有明确规定,则这些方法也可能对您不利。例如:
问题内容: 有什么用的,并在Hibernate?因为我在互联网上发现的每个示例都将数据插入到单个表中,并使用两个不同的类来做到这一点。我的观点是,如果我使用单个表,那么我可以在单个类中映射所有列,那么为什么要使用不同的类。如果我们使用两个不同的表,则存在和hibernate关系。 问题答案: Hibernate 1中有两种对象。Value Object2 。实体 价值对象 是不能独立存在的对象。以
问题内容: 好的,假设我们有两个表,和。在评论中,我们有一列,它表示哪个用户键入了该特定评论。为什么我们需要将其指定为外键?如果我们不这样做,它将仍然有效。我们指定主键,因为据我所知,它可以使查询速度更快(我们只需要搜索一行,而当我们没有主键/索引时,则必须遍历所有行)。这只是一种良好的编码习惯吗? 问题答案: 使用外键时,您将获得: 数据的完整性 更快的查询。 用户: 用户ID: 1个 2个 3
我们为什么使用: 而不是: ?