2014-02-22 44 views
1

我通过串行通信接收字节数组并将字节数组的一部分转换为整数。代码如下:如何在Python中更优雅地将字节数组转换为整数

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  

总之,我解压的bytearray data起始地址为8和下去,直到我打的b'\x03'的定界符。所以我打开一个1到3位数的整数,并将数值放入value

这个蛮力方法的作品。但是在Python中有更好的方法吗?我对这门语言很陌生,并且想要学习更好的方法去做这些事情。

回答

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中很少或根本没有变化。

+0

感谢您的代码。当我尝试,我得到了以下错误: builtins.ValueError发生 消息:无效的文字为int()与基地10:“b'0'” – Daanii

+0

我想你说'return int(str(ba [0:i]))'有这个ValueError。如果是这样,听起来好像你的'data'(来自'conn.recv')包含四个ASCII字符'b'0'',后面跟着你的分界符。 “b'0'”对于可转换为整数的字符串是无效的Python语法。我不清楚你的'conn.recv'发送给你什么语法。你从规格中知道吗?它看起来有点像它可能试图表达某种形式的二进制文字,在这种情况下只是零。您的原始代码不会引发错误,但它会告诉您“值”是49091,我确定这不是意图。 – mgkrebbs

相关问题