gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:11:13 56 4
gpt4 key购买 nike

上下文:我正在尝试一个程序来捕获一些 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/

56 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com