【问题标题】:How can I convert a byte array to an integer more elegantly in Python如何在 Python 中更优雅地将字节数组转换为整数
【发布时间】:2014-02-22 03:54:27
【问题描述】:

我通过串行通信接收字节数组并将部分字节数组转换为整数。代码如下:

data = conn.recv(40)
print(data)

command = data[0:7]

if(command == b'FORWARD' and data[7] == 3):
    value = 0
    counter = 8
    while (data[counter] != 4):
        value = value * 10 + int(data[counter] - 48)
        counter = counter + 1    

简而言之,我从位置 8 开始解压缩字节数组 data,直到遇到分隔符 b'\x03'。所以我解压了一个 1 到 3 位的整数,并将数值放入 value

这种蛮力方法有效。但是在 Python 中有没有更优雅的方法呢?我是这门语言的新手,想学习更好的方法来做这些事情。

【问题讨论】:

    标签: python integer bytearray


    【解决方案1】:

    你可以找到分隔符,把bytearray的子​​串转换成str再转换成int。这里有一个小函数可以做到这一点:

    def intToDelim( ba, delim ):
        i=ba.find( delim )
        return int(str(ba[0:i]))
    

    你可以用

    调用
    value = intToDelim( data[8:], b'\x04' )
    

    (如果这是您的分隔符,则使用 b'\x03')。这在 Python 2.7 中有效,并且在 Python 3 中几乎不需要更改。

    【讨论】:

    • 感谢您的代码。当我尝试这样做时,出现以下错误:发生了 builtins.ValueError 消息:int() 的无效文字,基数为 10:“b'0'”
    • 我猜你是说return int(str(ba[0:i]))得到了这个ValueError。如果是这样,听起来您的data(来自conn.recv)包含四个ASCII 字符b'0',后跟您的分隔符。对于可转换为整数的字符串,“b'0'”不是有效的 Python 语法。我不清楚您的conn.recv 发送给您的语法是什么。你知道从规格吗?它看起来有点像它可能试图表达某种形式的二进制文字,在这种情况下只是零。您的原始代码不会引发错误,但它会告诉您 value 是 49091,我确定这不是故意的。
    猜你喜欢
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2015-12-06
    • 1970-01-01
    • 2020-03-19
    相关资源
    最近更新 更多