Создание списка битов? - PullRequest
       10

Создание списка битов?

0 голосов
/ 10 ноября 2018

В настоящее время у меня есть две функции: char2bin и segmentString.

gmentString принимает строку и символ заполнения и возвращает списки из 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)

Мне нужно создать функцию (в этом примере давайте назовем ее фреймером), которая берет результат из plotString и преобразует его в список битов, где каждый список битов содержится в отдельном списке в списке.

Например, из функции plotString это создаст список из двух строк. Каждая буква каждой отдельной строки преобразуется в список битов, и каждый список битов содержится в виде списка для каждой строки.

>>>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. Как бы я это сделал?

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Вы можете использовать приведенный ниже код для достижения своей цели.

def segment_string(s, fill_by):
    l = []
    while s:
        if len(s) < 8:
            s = s + (fill_by) * (8 - len(s))

        l.append(s[0:8])
        s = s[8:]   

    return l  # ['Hello, W', 'orld!---']

def char2bin(ch):
    a = bin(ord(ch))[2:]
    l = [int(c) for c in a]

    if len(l) < 8:
        l = ([0] * (8 - len(l))) + l # Adding extra 0s to front (if len(l) < 8)

    return l # [0, 1, 0, 0, 1, 0, 0, 0]

def framer(s, fill_by='-'):
    segments = segment_string(s, fill_by) # Calling segment_string()
    print(segments)

    arr = []
    for segment in segments:
        arr2 = []
        for ch in segment:
            arr3 = char2bin(ch); # Calling char2bin()
            arr2.append(arr3)

        arr.append(arr2)

    return arr # final list to be returned


if __name__ == "__main__":
    f = framer('Hello, World!', '~')
    print(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, 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, 1, 1, 1, 1, 1, 1, 0], [0, 1, 1, 1, 1, 1, 1, 0], [0, 1, 1, 1, 1, 1, 1, 0]]]

# >>> bin(126)
# '0b1111110'
# >>>
# >>> chr(126)
# '~'
# >>>
0 голосов
/ 10 ноября 2018

Для этого вы можете использовать понимание списка:

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]]]
0 голосов
/ 10 ноября 2018

Вы можете использовать списки или модуль itertools.

Вы можете узнать больше о списочном понимании здесь и больше о itertootls здесь .

...