Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encoding 为什么base64编码的字符串末尾有=符号_Encoding_Base64 - Fatal编程技术网

Encoding 为什么base64编码的字符串末尾有=符号

Encoding 为什么base64编码的字符串末尾有=符号,encoding,base64,Encoding,Base64,我知道什么是base64编码,以及如何计算C#中的base64编码,但是我多次看到,当我将字符串转换为base64时,末尾有一个= 出现了几个问题: base64字符串是否总是以=结尾 为什么一个=会附加在末尾 它起到了很好的作用 更完整的答案是,base64编码的字符串并不总是以=结尾,如果需要将字符串填充到适当的长度,它将仅以一个或两个=结尾。来自: 最后一个“==”序列表示最后一个组只包含一个字节,“=”表示它包含两个字节 因此,这是某种填充。等号(=)在某些形式的base64编码中用作填

我知道什么是
base64
编码,以及如何计算C#中的
base64
编码,但是我多次看到,当我将字符串转换为base64时,末尾有一个
=

出现了几个问题:

  • base64
    字符串是否总是以
    =
    结尾
  • 为什么一个
    =
    会附加在末尾
  • 它起到了很好的作用

    更完整的答案是,base64编码的字符串并不总是以
    =
    结尾,如果需要将字符串填充到适当的长度,它将仅以一个或两个
    =
    结尾。

    来自:

    最后一个“==”序列表示最后一个组只包含一个字节,“=”表示它包含两个字节

    因此,这是某种填充。

    等号(=)在某些形式的base64编码中用作填充。base64上的具有所有详细信息。

    如果编码数据末尾的可用位少于24位,则在中将其定义为特殊填充字符。

    它是填充字符。发件人:

    理论上,解码不需要填充字符,因为 可以根据Base64的数量计算缺少的字节数 数字。在某些实现中,填充字符是必需的,
    而其他人则不使用。填充字符的一种情况 需要连接多个Base64编码文件

  • 没有
  • 将Base64编码字符串的长度填充为4个字符的倍数,以便正确解码
  • 将“Mary had”编码为基数64

    在本例中,我们使用了一个简单的文本字符串(“Mary had”),但无论数据是什么(例如图形文件),该原则都适用。要将每个24位的输入数据转换为32位的输出数据,Base64编码将24位拆分为4个6位的块。我们注意到的第一个问题是,“Mary had”不是3字节的倍数,而是8字节长。因此,最后一组位只有4位长。为了解决这个问题,我们添加了两个额外的“0”位,并通过在末尾添加“=”来记住这个事实。如果要转换为Base 64的文本字符串的长度为7字节,则最后一个组将有2位。在本例中,我们将添加四个额外的“0”位,并通过在末尾添加“==”来记住这一事实

    1:没有

    2:简而言之: 第65个字符(“=”号)仅在消息编码的最后过程中用作补码

    如果字符串的数字是3个字符的倍数,则不会有“=”符号,因为在ASCII标准中,
    Base64
    编码将每个3个字节(8位)表示为4个可打印字符

    详情:

    (a)如果要编码

    ABCDEFG[
    ABC
    ][
    DEF
    ][
    G

    Base64
    将处理第一个块(产生4个字符)和第二个块(完成后)。但对于第三个块,它将在输出中添加一个双
    =
    ,以完成所需的4个字符。因此,结果将是qjdREVGRw=(没有空格)

    (b)如果要编码

    ABCDEFGH[
    ABC
    ][
    DEF
    ][
    GH

    类似地,它将只在输出的末尾添加一个
    =
    ,以获得4个字符


    结果将是qjdREVGR0g=(不带空格).

    =
    是一个填充字符。如果输入流的长度不是3的倍数,则将添加填充字符。解码器需要这样做:如果不存在填充,则最后一个字节的零位数将不正确


    这里有更好更深入的解释:

    这与C#完全无关。实际上它与C#有关,并非所有语言都包含=,例如许多perl库都省略了=,因此了解用户使用的环境实际上是相关的。这似乎使它在某些CA中成为一种不太有效的混淆方法es,因为它是可检测的。@user1167442 Base64不是用于模糊处理的。它是用于将二进制数据(或带有unicode和其他特殊字符的字符串)作为字符串传输的。您能解释一下为什么“==”是1个字节而“=”是2个字节的逻辑吗?我只是不明白。为什么输入“任何肉体的快乐”会得到结果“YW55IGNhcm5hbCBwbGVhc3VyZS4=”,而“任何肉体的愉悦”都可以得到结果“YW55IGNhcm5hbCBwbGVhc3VyZQ”==“?不是说“==”是1个字节,“=”是2个字节。而是说,你需要在整个字符串中始终有4个字节的倍数。所以你用“=”符号填充,直到得到为止。第一个字符串比第二个字符串多一个字符,所以需要少填充一个“=”。这个答案应该是注释吗?“需要填充字符的一种情况是连接多个Base64编码的文件。”@AndréPuel:重新同步一个
    =
    就足够了。如果您想找到以前的边界,那么应该始终存在终止符(仍然只需要一个字符)。Base64的整个填充概念只是一个愚蠢的想法…不过,该链接与Base64完全无关。我只希望发布一个相关且可靠的链接,通过插图和示例有效地解释
    Base64
    中的填充。当前指向wikipedia的链接与@NH.提及的内容完全无关。@Fr0zenFyr如果你想要一个链接,这很好。但是这个确实是一个更好的链接(只是还没有赶上投票)。关于“需要填充字符的一种情况是连接多个Base64编码文件”的部分是错误的。例如,当连接两个Base64文件时,源字节