首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在micropython中剪切和转换字节

如何在micropython中剪切和转换字节
EN

Stack Overflow用户
提问于 2022-09-22 13:13:22
回答 1查看 46关注 0票数 0

我正在尝试用micropython来解码能帧。我错过了python3.x中的许多函数。我从MCP2515的Rx缓冲区获得8个十六进制长字节。关于信息,我使用的是openMV IDE。我想提取第一和第二是整数,第三和第四是另一个,等等.

在我的研究过程中,我发现了一个将字节转换为有符号整数的函数(因为sign=True参数不是在from_byte函数中实现的)。主要的问题是在其他python论坛上提供的解决方案只是针对pc的python3.x,而不是micropython,很多解决方案的结尾都是“函数不存在”。

代码语言:javascript
复制
byte = b'\x12\x34\x56\x78\x9A\xBC\xDE\xFF'
 
def byte2int(bList, signed:bool=False):
    if signed :
        r = 0
        for i in range(2):
            d = 32 - ((i + 1) * 8)
            r += bList[i] << d
        return r
    else : return int.from_bytes(byte, 'big')

此外,我认为当打印(B)返回时,我不能信任打印函数:

代码语言:javascript
复制
> print(b)
b'\x124Vx\x9a\xbc\xde\xff'

我不明白为什么3消失了,在4之后被“V”取代!有时,当我打印非十六进制字符的罐头帧时,我的MCP2515会返回一些“AC.26”、“?”、“.”、‘’>、'<‘或'=’。我的假设是,这些是损坏的帧或SPI传输。

拜托,有人能帮我理解为什么micropython会给我这些混乱的结果吗?

非常感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-22 14:49:18

我写了些东西。也许不是最好的优化,但我必须处理比Python3.x更高级的micropython

这是一个解决方案(当然不是最优的)。但它似乎奏效了。

代码语言:javascript
复制
byte = b'\xFF\xC8\x56\x78\x9A\xBC\xDE\xFF'
byte2 = b'\x00\x00\x00@\x00\x00\x00\x00'

def extract(trame, signed:bool=False):
    r = [0,0,0,0]
    trame = [int(x) for x in bytearray(byte)]
    for i in range(len(trame)/2):
        val = (trame[i*2]<<8)+trame[i*2+1]
        if signed and val > 0x8000 :
                r[i] = -(65535-int(val)+1)
        else :
            r[i] = int(val)
    return r

print(extract(byte, True))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73815291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档