2016-04-16 3 views
0

В настоящее время я работаю над действительно простым алгоритмом алгоритма шифрования, чтобы показать базовое понимание того, как работает шифрование, и мой алгоритм шифрования в основном просто использует функцию ord() для преобразования стандартных символов ASCII в целые числа, над которыми алгоритм может работать.Python: Преобразование специальных символов в действующие целые числа?

Проблема, с которой я столкнулся, заключается в том, что мне также нужна моя программа для шифрования, например, содержимого исполняемого файла (EXE) Windows. Для этого мне нужно преобразовать все виды специальных символов (Not ASCII) в целые числа, с которыми я могу работать.

Я не знаю много о кодировании, но из того, что я понимаю, «ord()» работает только потому, что есть карта символов ASCII, которая имеет соответствующее число для каждого символа. Я не мог понять, как преобразовать специальные символы EXE-файла прямо в целые числа, поэтому я попытался преобразовать в байты, которые кажутся мне более универсальными (пожалуйста, поправьте меня, если я ошибаюсь).

На данный момент я просто ищу решение, чтобы иметь возможность читать EXE-файл и преобразовывать каждый символ в число, определенное для этого символа (для целей шифрования/дешифрования).

+0

Вы можете использовать модуль python [struct] (https://docs.python.org/3/library/struct.html) для преобразования значений в байты. – th3an0maly

+1

'struct' является излишним, им не нужно интерпретировать байты как многобайтовые значения, представляющие числа, или гетерогенную смесь значений в двоичном потоке. –

ответ

3

Вы вводите в заблуждение значение, присвоенное байтам (например, стандарт ASCII), с самими байтами. ord() просто дает вам числовое значение для данного байта. Этот Python интерпретирует эти байты и показывает, что коды ASCII не являются ни здесь, ни там.

Другими словами, ord() не должен консультироваться с таблицей ASCII и может обрабатывать любое значение байта. Все, что нужно сделать, это взять уже известное значение байта и предоставить для него объект Python int.

Прочитайте ваши данные как двоичные файлы (откройте файл с b, добавленным в режим файла) и используйте ord(). В Python 2 это приведет к str объектам, и каждый символ в таком объекте действительно является байтовым значением в диапазоне 0 - 255.

Обратите внимание, что если вы используете Python 3, чтение из файла в двоичном формате результаты в режиме bytes объекта, что делает его еще яснее, что эти целые значения в диапазоне:

>>> b'abc' 
b'abc' 
>>> b'abc'[0] 
97 

Индексирование к отдельной точке в bytes объекта производит целое значение, и не требуется вызов ord().