Я пытаюсь сделать программу python, которая преобразует текст в одну длинную двоичную строку. Обычная строка теста и предложений достаточно проста для преобразования в двоичный файл, но у меня проблемы с пробелами.
Как поместить двоичный байт, чтобы представить ключ ввода?
Я просто вставляю строки '/' и 'n'?
В идеале я хотел бы иметь возможность конвертировать весь текстовый файл в двоичную строку и иметь возможность конвертировать его обратно. Очевидно, что если бы я сделал это с помощью скрипта python, табуляция была бы испорчена, и программа была бы сломана.
Будет ли C-язык лучше для этого?
Очевидно, что программа C по-прежнему будет работать без ее пробелов, тогда как python не будет.
Короче говоря, мне нужно знать, как представлять ключи "tab" и "enter" в двоичном формате и как создать функцию для преобразования их в двоичную. будет ли бит (ord ('\n')) хорошим?
Вкладка представлена в диаграмме ASCII как 0x08 0x09, или "00001000" "00001001" в двоичной строке.
Клавиша Enter отличается тем, что может представлять CR (возврат каретки), LF (Linefeed) или и то, и другое.
CR представляется как 0x0d, или "00001101" в виде двоичной строки. LF представляется как 0x0A, или "00001010" в виде двоичной строки.
Общее соглашение - '\ t' для tab и '\ r' для CR, '\n' для новой строки.
Как насчет простой:
def text_to_bits(text):
bytes = text.encode('utf8')
bits = [bin(ord(c))[2:].zfill(8) for c in bytes]
return ''.join(bits)
Это будет использовать точно байты в text
(некогда закодированные в utf8
- это будет безобидно, если text
начинается с ASCII, но незаменим, если он Unicode!), Поэтому не требуется никаких соглашений или другой договоренности - вы получите строка 0
и 1
с, восемь бит на байт.
Как справедливо указывает комментарий @gnibbler, если text
длиной в сотни символов, таблица поиска будет быстрее, например, заменив предыдущие bits =
двумя строками:
lookup = {c: bin(c))[2:].zfill(8) for c in range(256)}
bits = [lookup[ord(c)] for c in bytes]
В качестве альтернативы lookup
также может быть списком:
lookup = [bin(c))[2:].zfill(8) for c in range(256)]
Все они должны работать одинаково, выбрать комбинацию скорости и ясности, которая лучше всего подходит для вас! -)
A = [format(c, "08b") for c in range(256)]
а затем [A[c] for c in bytes]
ord
, мы оба забыли :-). Независимо от bin + zfill
, быстрее ли format
или bin + zfill
(то же bin + zfill
, список против dict для таблицы поиска), необходимо использовать -mtimeit
с -mtimeit
, хотя я думаю, что ваша идея format
имеет большую читабельность.