AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 537376
Accepted
MatrixManAtYrService
MatrixManAtYrService
Asked: 2019-08-26 12:24:40 +0800 CST2019-08-26 12:24:40 +0800 CST 2019-08-26 12:24:40 +0800 CST

为什么从 base64 转换并返回此字符串的末尾会出现乱码?

  • 772

命令:

echo "HelloWorld==" | base64 -d | base64

输出:

HelloWorlQ==

为什么我的d现在是一个Q?

编辑:

我不想从任意数据开始并对其进行 base64 编码。我的意图是从 Base64 开始并以 Base64 结束,在此期间只产生了一个二进制值。

编辑 2:

我注意到如果输入字符串是四个字符的倍数,则不会发生这种情况,所以我认为这是与填充的交互:

❯ echo 'abcdefghij==' | base64 -d | base64
abcdefghig==

❯ echo 'abcdefgh' | base64 -d | base64 
abcdefgh

编辑 3

删除了对标志的混淆提及-i,结果证明这与我的问题无关。

base64
  • 3 3 个回答
  • 3523 Views

3 个回答

  • Voted
  1. Philip Couling
    2019-08-26T14:07:51+08:002019-08-26T14:07:51+08:00

    HelloWorld==包含无法解码的信息,并且在技术上不是有效的 Base64,因为它们通常应该被0填充。当1你echo "HelloWorld==" | base64 -d.

    解释...

    Base64 适用于 4 个字符的组。每个字符代表 6 位,因此每组 4 个解码为 3 个字节(每字节 8 位)。唯一的例外是最后 4 个字符,这将根据=符号的数量而有所不同。Base64 字符串总是能被 4 整除。

    • 0 解码为 3 个字节
    • 1 = 解码为 2 个字节
    • 2 == 解码为 1 个字节

    在您的示例中Hell,并且oWor都是有效的。但ld==不是。要了解为什么要查看此查找表: https ://en.wikipedia.org/wiki/Base64

    ld==应该只解码为一个字节,因为它最后有两个=。但ld解码为: 100101 011101. 一个字节只有八个 8 位。因此,当您使用 解码字符串时base64 -d, only100101 01将被转换为字节,并且结尾1101将被完全忽略。

    任何以 64 为结尾的字符串==只能使用最后一个字符的前两位。那是唯一有效的结尾==是Q== A== w== g==

    • 5
  2. Best Answer
    Kusalananda
    2019-08-26T14:11:09+08:002019-08-26T14:11:09+08:00

    是的,这是与填充的交互。

    让我们通过解码来查看您的实际编码数据,并且(因为它不是 ASCII 字符串)将其转换为二进制:

    $ base64 -d <<<'HelloWorld==' | xxd -b
    00000000: 00011101 11101001 01100101 10100001 01101010 00101011  ..e.j+
    00000006: 10010101                                               .
    

    这是HelloWorld==base64编码的数据。Philip Couling解释了最终ld==部分解码的复杂性,并且在某种程度上,d在解码数据时实际使用了由该部分编码的数据的三分之一。下面我将展示Q重新编码数据时的来源。

    让我们重复那个二进制文件:

    00011101 11101001 01100101 10100001 01101010 00101011 10010101
    

    以六位为一组(这是 base64 编码器将使用的):

    000111 011110 100101 100101 101000 010110 101000 101011 100101 01
    

    这在末尾填充了四个零位,以形成 10 个完整的 6 位代码:

    000111 011110 100101 100101 101000 010110 101000 101011 100101 010000
    

    这010000是Q您在重新编码数据时看到的(参见 base64 代码表)。

    • 4
  3. James John
    2019-08-26T12:29:12+08:002019-08-26T12:29:12+08:00

    管道不正常。在解码之前,您应该先编码。

    $ echo "Hello World!==" | base64 | base64 -id
    Hello World!==
    

    您正在解码无效的 base64 编码格式。

    • 2

相关问题

  • 如何将 base64 utf-8 编码字符串从 bash 转换为二进制文件?

  • 使用 AES 加密和 BASE64 编码的 SSH 私钥如何具有小于指定的大小?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve