如何从 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 中没有bytes
的hex
属性。
以下内容已在运行 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 中的字节数组/字节转换?的主要内容,如果未能解决你的问题,请参考以下文章