python - 创建位列表?

标签 python list bit

目前,我有两个函数:char2binsegmentString

segmentString 接受一个字符串和一个填充字符,并返回 8 个字符串的列表。例如,如果有一个 13 个字符的字符串,它会将其拆分为两个字符串的列表,其中第二个字符串具有 3 个填充字符以使其成为一个完整的 8。

>>>segmentString("Hello, World!", "-")
['Hello, W', 'orld!---']

char2bin 获取单个字符串字符(单个字符)并将它们转换为 8 位列表。它不适用于多个字符串。例如,

>>>char2bin('a')
[0,1,1,0,0,0,0,1]
>>>char2bin('abc')
(ERROR)

我需要创建一个函数(在这个例子中,我们称它为 framer),它从 segmentString 获取结果并将其转换为位列表,其中每个位列表包含在列表中的单独列表中。

例如,从 segmentString 函数中,这将创建一个包含两个字符串的列表。每个单独字符串的每个字母都被转换成位列表,每个位列表作为每个字符串的列表包含在内。

>>>F=framer("Hello, World!", "-")
>>>F
[[[0, 1, 0, 0, 1, 0, 0, 0], [0, 1, 1, 0, 0, 1, 0, 1], [0,1, 1, 0, 1, 1, 0, 0], [0, 1, 1, 0, 1, 1, 0, 0], [0, 1, 1, 0, 1, 1,1,1], [0, 0, 1, 0, 1, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 1,1, 1,0, 1, 1, 1]], [[0, 1, 1, 0, 1, 1, 1, 1], [0, 1, 1, 1, 0, 0,1, 0], [0,1, 1, 0, 1, 1, 0, 0], [0, 1, 1, 0, 0, 1, 0, 0], [0, 0,1, 0, 0, 0, 0,1], [0, 1, 1, 1, 1, 1, 1, 0], [0, 1, 1, 1, 1, 1,1, 0], [0, 1, 1, 1,1, 1, 1, 0]]]

如您所见,有一个通用列表包含两个包含 8 个位列表的列表,这些列表是通过 char2bin 从字符串字符转换而来的。 我该怎么做?

最佳答案

您可以为此使用列表理解:

def char2bin(byte):
    return list(map(int, format(byte, '08b')))

def segmentString(text, padding, chunksize):
    for index in range(0, len(text), chunksize):
        yield text[index:index + chunksize].ljust(chunksize, padding)

def framer(text, padding='-', chunksize=8, encoding='utf8'):
    return [[char2bin(byte) for byte in segment] for segment in
            segmentString(text.encode(encoding), padding.encode(encoding), chunksize)]

这使用 utf8 编码,但由于您的输入文本都是 ascii 字符,因此每个字符一个字节。

>>> framer('Hello, World!')
[[[0, 1, 0, 0, 1, 0, 0, 0],
  [0, 1, 1, 0, 0, 1, 0, 1],
  [0, 1, 1, 0, 1, 1, 0, 0],
  [0, 1, 1, 0, 1, 1, 0, 0],
  [0, 1, 1, 0, 1, 1, 1, 1],
  [0, 0, 1, 0, 1, 1, 0, 0],
  [0, 0, 1, 0, 0, 0, 0, 0],
  [0, 1, 0, 1, 0, 1, 1, 1]],
 [[0, 1, 1, 0, 1, 1, 1, 1],
  [0, 1, 1, 1, 0, 0, 1, 0],
  [0, 1, 1, 0, 1, 1, 0, 0],
  [0, 1, 1, 0, 0, 1, 0, 0],
  [0, 0, 1, 0, 0, 0, 0, 1],
  [0, 0, 1, 0, 1, 1, 0, 1],
  [0, 0, 1, 0, 1, 1, 0, 1],
  [0, 0, 1, 0, 1, 1, 0, 1]]]

非 ascii 字符需要多位编码。

>>> framer('💩', padding='\x00')
[[[1, 1, 1, 1, 0, 0, 0, 0],
  [1, 0, 0, 1, 1, 1, 1, 1],
  [1, 0, 0, 1, 0, 0, 1, 0],
  [1, 0, 1, 0, 1, 0, 0, 1],
  [0, 0, 0, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 0, 0, 0]]]

关于python - 创建位列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53240083/

相关文章:

byte - "word"是多少位?

python - 使用递归函数处理构建字符串

Python raw_input 带有强制 TLD?

c# - 按索引修改列表中的元素

python - 使用其他列的值列表创建一个列

string - 字符 ' ' 处的字符串/字 rune 字中的词法错误?

c - 按位 C 表达式在函数中返回不同的结果?

Python SocketServer.BaseRequestHandler 不会与远程请求通信

python - 链式 celery 任务是否保证在同一节点工作线程上运行?

c++ - C++中的按位扩展