如何从 micropython 中的字节数组/字节转换?

Posted

技术标签:

【中文标题】如何从 micropython 中的字节数组/字节转换?【英文标题】:How to convert from bytearray/bytes in micropython? 【发布时间】:2021-06-28 18:54:29 【问题描述】:

我在 pi pico 上的 micropython 中使用 uhashlib 进行哈希处理。这是一个例子:

import sys
import os
import uhashlib
import time

time_now = "blergh"
hash_test = uhashlib.sha256(time_now).digest()

print(time_now)
print(hash_test)

这个输出:

blergh
b'Y|\x84W\xa1\x1d\x86cb~\x0bL\x1e\\\x92\xcd-\x93\x05\xddz\x0e\xe1\x9f\x9a\xc1H6\x93\xd8\x0c8'

...这显然不是很有用。我尝试了很多东西,但我不知道如何从 micropython 中的字节(b'...')转换。有人有想法/方法吗?

【问题讨论】:

您的问题是什么?你也可能想要.hexdigest() hexdigest 是我将用于 hashlib (python),但 uhashlib (micropython) 不支持它。这个问题正是你所理解的,不过,当我想要一个 hexdigest 时,我得到了字节码。 我也尝试过 ubinascii.hexlify(hash.digest()) ,但没有骰子 - 我想知道这是否只是在 micropython 中被打破了? 请注意,“字节码”在这里不适合使用。是的,它是由字节组成的,是的,您可以将其称为代码 - 但该术语用于指代可以由某些解释性语言执行的字节,而您在这里拥有的是纯粹的数据。 【参考方案1】:

使用ubinascii.hexlify 并跳过障碍。

ubinascii.hexlify() 返回bytes。通过将bytes 解码为str,然后将str 转换为int(使用base16),我们可以将值传递给hex()。 micropython 中没有byteshex 属性。

以下内容已在运行 micropython 1.14 的 Raspberry Pi Pico 上进行了全面测试。我怀疑早期版本也可以工作,只要它们拥有两个模块依赖项。

import ubinascii, uhashlib

hs = uhashlib.sha256(b'blergh')

def hexdigest(sha):
    return hex(int(ubinascii.hexlify(sha.digest()).decode(), 16))

hx = hexdigest(hs) #0x597c8457a11d8663627e0b4c1e5c92cd2d9305dd7a0ee19f9ac1483693d80c38

【讨论】:

是的,完美。谢谢!【参考方案2】:

您应该能够使用.hex() 方法直接将任何字节解码为十六进制!

>>> b"blerg".hex()
'626c657267'

我没有uhashlib,但这适用于股票hashlib

>>> hashlib.sha256(b"blergh").digest().hex()
'597c8457a11d8663627e0b4c1e5c92cd2d9305dd7a0ee19f9ac1483693d80c38'
>>> hashlib.sha256(b"blergh").hexdigest()
'597c8457a11d8663627e0b4c1e5c92cd2d9305dd7a0ee19f9ac1483693d80c38'

【讨论】:

是的,这就是我在标准 Python 中所做的,但这不能在 micropython / pi pico 上运行。

以上是关于如何从 micropython 中的字节数组/字节转换?的主要内容,如果未能解决你的问题,请参考以下文章

如何从Java中的字节数组中获取数据?

如何从 C# 中的 Web Api 方法正确获取字节数组?

如何从 Java 中的 BigInteger 获取无符号字节数组?

如何以字节数组从服务器中的文件中读取数据

从 C++ 中的字节数组创建 HICON?

如何使用 C# 从字节数组中显示 Web 表单中的图像