python - 理解 Python 的 Base64 解码字节表示

标签 python node.js python-3.x base64

上下文: 我正在尝试一个程序来捕获一些 MQTT 消息然后记录它们。在这样做时,我遇到了一个奇怪的问题,我需要帮助。

在传入的消息中,我收到一个经过 Base64 编码的字符串。我的程序尝试解码和解析二进制数据以找出数据包的一些 header 。我的代码如下所示:

result = base64.standard_b64decode("AO/Nq4lnRSMBZXMnLHcKXhSObYxiFvY=")

结果的输出如下所示:

b"\x00\xef\xcd\xab\x89gE#\x01es',w\n^\x14\x8em\x8cb\x16\xf6"

如果使用 NodeJS 实现完成相同的操作,则输出完全不同:

<Buffer 00 ef cd ab 89 67 45 23 01 65 73 27 2c 77 0a 5e 14 8e 6d 8c 62 16 f6>

我阅读了堆栈溢出中的一些其他链接,但无法理解为什么存在差异。链接NodeJS base64 Vs Python base64对于已完成的编码有一些有效点,因此 Python 在这里所做的并没有错。

进一步阅读后,我发现了另一个使用 binascii 函数的技巧。因此,如果我应用此逻辑,我的输出看起来与 NodeJS 输出完全相同!

import binascii
binascii.hexlify(result)
b'00efcdab89674523016573272c770a5e148e6d8c6216f6'

现在我的输出看起来就像我想要的。然而,还有另一个新问题。 Base64 解码的输出格式为 b'\x00',而 hexlify 的输出格式为 b'0'。由于这种差异,我无法运行代码的其他部分,该部分将输出逐字节分割以根据数据包的 header 以不同的格式执行 struct.unpack。

我可以得到任何帮助来继续吗?

最佳答案

如果我理解得好的话,你会对 Python 的字节格式感到困惑。

基本上,当在 Python 中显示一个字节时,如果该字节与 ASCII 字符匹配,则使用该字符而不是数值。 Python 和 NodeJS 中的结果实际上是相同的,只是表示形式不同。

您可以通过对齐两个表示来检查它:

b"    \x00\xef\xcd\xab\x89  g  E  #\x01  e  s  '  ,  w \n  ^\x14\x8e  m\x8c  b\x16\xf6"
<Buffer 00  ef  cd  ab  89 67 45 23  01 65 73 27 2c 77 0a 5e  14  8e 6d  8c 62  16  f6>

如您所见,这些值是相同的,除了:

67 -> g
45 -> E
23 -> #
65 -> e
73 -> s
27 -> '
2c -> ,
0a -> \n
5e -> ^
6d -> m

事实上,上面显示的每个十六进制值都与 ASCII 表中的一个字符匹配。

您可以在 Python 解释器中轻松验证它(ord 给出给定字符的 ascii 代码,hex 将其转换为十六进制表示形式):

>>> hex(ord('g'))
'0x67'
>>> hex(ord('E'))
'0x45'
>>> hex(ord('#'))
'0x23'

最后,您甚至可以在几行 Python 中获得与 NodeJS 完全相同的表示:

>>> bytes = b"\x00\xef\xcd\xab\x89gE#\x01es',w\n^\x14\x8em\x8cb\x16\xf6"
>>> print('<Buffer {}>'.format(' '.join([format(c, '02x') for c in bytes])))
<Buffer 00 ef cd ab 89 67 45 23 01 65 73 27 2c 77 0a 5e 14 8e 6d 8c 62 16 f6>

关于python - 理解 Python 的 Base64 解码字节表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55242346/

相关文章:

python - 查找 numpy 对值(不带零)并获取 key

javascript - Node.js Express、路由器、可选参数作为扩展

python - 从使用 matplotlib 生成的 delaunay 三角剖分获取外心

Python urllib2 和动态加载的数据

python - 即使 base.py 存在,也没有名为 'base' 的模块

javascript - 尝试运行 "node ."时出现语法错误如何修复?

node.js - 如何在 Docker 中为 nodejs 应用程序设置单元测试?

python - 制作与其他属性的值一起计算的属性

python - 如果非空,则将字典的值写入列表中

iis - 尝试在 IIS 上运行第一个 python 脚本时出错