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)

我想知道是否有更轻松的方法。一些内置的功能或类似的东西。有什么想法吗?

我认为创建一个中间字符串数组,循环或使用缓慢的功率函数既不需要。

可以使用summap和二进制移动操作员将解决方案倒入一个衬里。

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

最新更新