我正在为我们的一个新硬件设备准备新的驱动程序。
设置它的一个选项是一个字节,其中有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)
我想知道是否有更简单的方法来做到这一点。一些内置功能或类似的东西。有什么想法吗?
答案 0 :(得分:1)
基本上你已经在做什么,但更短:
data = int(''.join(['1' if i else '0' for i in settings]), 2)
但这是您正在寻找的答案: Bool array to integer
答案 1 :(得分:0)
我相信你想要这个:
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)
答案 2 :(得分:0)
我认为之前的答案创造了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)
有关更多示例,请访问以下网站:binary python