我正在为我们的新硬件设备之一准备新驱动程序。
设置它的选项之一是一个字节,其中有8个选项。每一口都打开或关闭其他东西。
因此,基本上我需要做的是,取8个零或一个字节,然后创建一个字节。
我做的是,我为此准备了助手功能:
@staticmethod
def setup2byte(setup_array):
"""Turn setup array (of 8 booleans) into byte"""
data = ''
for b in setup_array:
data += str(int(b))
return int(data, 2)
这样称呼:
settings = [echo, reply, presenter, presenter_brake, doors_action, header, ticket_sensor, ext_paper_sensor]
data = self.setup2byte(settings)
packet = "{0:s}{1:s}{2:d}{3:s}".format(CONF_STX, 'P04', data, ETX)
self.queue_command.put(packet)
我想知道是否有更轻松的方法。一些内置的功能或类似的东西。有什么想法吗?
我认为创建一个中间字符串数组,循环或使用缓慢的功率函数既不需要。
可以使用sum
和map
和二进制移动操作员将解决方案倒入一个衬里。
settings = [False, True, False, True, True, False, False, True]
x = sum(map(lambda x: x[1] << x[0], enumerate(settings)))
print(bin(x))
> 0b10011010
备注:数组中的第一个元素具有最低的prio,否则需要逆转设置。
我相信你想要这个:
convert2b = lambda ls: bytes("".join([str(int(b)) for b in ls]), 'utf-8')
其中 ls
是布尔人的列表。在Python 2.7和3.x中作品。替代品更像您的原始:
convert2b = lambda ls: int("".join([str(int(b)) for b in ls]), 2)
基本上是您已经在做的事情,但是较短:
data = int(''.join(['1' if i else '0' for i in settings]), 2)
,但这是您要寻找的答案:布尔数组到整数
我认为先前的答案创建了8个字节。该解决方案仅创建一个字节
settings = [False,True,False,True,True,False,False,True]
# LSB first
integerValue = 0
# init value of your settings
for idx, setting in enumerate(settings):
integerValue += setting*2**idx
# initialize an empty byte
mybyte = bytearray(b'x00')
mybyte[0] =integerValue
print (mybyte)
有关更多示例,请访问这个很棒的网站:二进制python