текст - двоичное преобразование

0

Я пытаюсь сделать программу python, которая преобразует текст в одну длинную двоичную строку. Обычная строка теста и предложений достаточно проста для преобразования в двоичный файл, но у меня проблемы с пробелами.
Как поместить двоичный байт, чтобы представить ключ ввода?

Я просто вставляю строки '/' и 'n'?

В идеале я хотел бы иметь возможность конвертировать весь текстовый файл в двоичную строку и иметь возможность конвертировать его обратно. Очевидно, что если бы я сделал это с помощью скрипта python, табуляция была бы испорчена, и программа была бы сломана.

Будет ли C-язык лучше для этого?

Очевидно, что программа C по-прежнему будет работать без ее пробелов, тогда как python не будет.

Короче говоря, мне нужно знать, как представлять ключи "tab" и "enter" в двоичном формате и как создать функцию для преобразования их в двоичную. будет ли бит (ord ('\n')) хорошим?

  • 0
    Пожалуйста, уточните "одну длинную двоичную строку". Вы имеете в виду группу символов «1» и «0» без пробелов между ними? Для быстрой оценки размера возьмите количество символов в тексте и умножьте на 8, что даст вам размер вашей двоичной строки.
  • 0
    Поскольку вы, кажется, говорите об ASCII, почему бы не поискать значения для Tab и Enter?
Показать ещё 1 комментарий
Теги:
binary

2 ответа

0
Лучший ответ

Вкладка представлена в диаграмме ASCII как 0x08 0x09, или "00001000" "00001001" в двоичной строке.

Клавиша Enter отличается тем, что может представлять CR (возврат каретки), LF (Linefeed) или и то, и другое.

CR представляется как 0x0d, или "00001101" в виде двоичной строки. LF представляется как 0x0A, или "00001010" в виде двоичной строки.

Общее соглашение - '\ t' для tab и '\ r' для CR, '\n' для новой строки.

  • 0
    Общее соглашение может работать для OP, но тогда необходимо другое общее соглашение: удвоение обратной косой черты для ее представления.
0

Как насчет простой:

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)]

Все они должны работать одинаково, выбрать комбинацию скорости и ясности, которая лучше всего подходит для вас! -)

  • 1
    Вы можете использовать список поиска, чтобы сделать это быстрее, если есть много текста. например. A = [format(c, "08b") for c in range(256)] а затем [A[c] for c in bytes]
  • 0
    Прекрасное предложение, редактировал A ввести альтернативный поиск (и ord , мы оба забыли :-). Независимо от bin + zfill , быстрее ли format или bin + zfill (то же bin + zfill , список против dict для таблицы поиска), необходимо использовать -mtimeit с -mtimeit , хотя я думаю, что ваша идея format имеет большую читабельность.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню