двоичные данные файлов хранятся как переменные внутри файла python - PullRequest
0 голосов
/ 06 февраля 2011

Допустим, есть программа program.exe, я создам скрипт на python, который будет

  • читать program.exe в двоичном режиме и сохранять его в переменных данных
  • открыть mypytonprog.py в двоичном режиме добавления
  • добавить данные в mypythonprog.py (?)

перед этим mypythonprog.py будет подготовлен как:

program_data='''

после этого mypythonprog.py будет продолжаться как:

'''
programs continues....

(я хочу как-нибудь поместить этот программный код в переменную program_data)

Это, не работает, конечно, но можно ли это как-то сделать? В основном я хочу: mypythonfile.py, чтобы иметь возможность создавать исполняемый файл с двоичными данными, хранящимися внутри него.

Полагаю, мне нужно закодировать эти данные в шелл-код, чтобы иметь возможность поместить их в mypythonfile.py,
верно?

Ответы [ 2 ]

3 голосов
/ 06 февраля 2011
>>> 'some binary data'.encode('base64')
'c29tZSBiaW5hcnkgZGF0YQ==\n'
>>> 'c29tZSBiaW5hcnkgZGF0YQ==\n'.decode('base64')
'some binary data'
2 голосов
/ 06 февраля 2011
import base64

exe = 'c:/users/me/program.exe'
script = 'c:/users/me/newpython.py'
chunksize = 6144
linelength = 80

with open(exe,'rb') as inf, open(script,'w') as outf:
    outf.write('program_data = """')

    while True:
        progdata = inf.read(chunksize)
        if len(progdata):
            progdata = progdata.encode("base64")
            outf.writelines(progdata[i:i+linelength] for i in range(0, len(progdata), linelength))
        else:
            break

    outf.write('""".decode("base64")')

Редактировать:

Идея состоит в том, чтобы обрабатывать входной файл в удобных порциях, а не считывать потенциально большой файл в память.

После base64-кодируя фрагмент, я затем разделяю его на 80-символьные строки (это просто для того, чтобы управлять им в текстовом редакторе) и записываю в вывод.

Я оборачиваю данные в program_data = "" ".. "" ".decode (" base64 ") так, что когда Python загружает файл, данные будут автоматически расшифрованы - program_data будет содержать двоичные данные, которые вы хотите.

8096 был пердеж мозга - я имел в видуиспользовать 8192 байта (8 КБ).Затем я понял, что есть вторая проблема;кодирование фрагмента, отличного от кратного 3-х длинных символов, приводит к выводу с допуском '=', который преждевременно усекает декодирование.Я изменил размер чанка на 6 КБ = 512 байт (размер блока NTFS по умолчанию) * 3 символа * 4 (произвольное число);похоже, это работает как ожидалось.

Надеюсь, это поможет!

...