Python将布尔数组转换为二进制

时间:2017-11-30 14:34:39

标签: python

我正在为我们的一个新硬件设备准备新的驱动程序。

设置它的一个选项是一个字节,其中有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)

我想知道是否有更简单的方法来做到这一点。一些内置功能或类似的东西。有什么想法吗?

3 个答案:

答案 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