Лучший способ закодировать очень длинную строку двоичных файлов в простую с возможностью возврата форму с помощью Python?
-------------------------- Добавить новое---------------------- -------
Позвольте мне ввести дополнительную информацию здесь:
Фактическая ситуация такова, что у меня есть эта ДЛИННАЯ СТРОКА в среде A, и мне нужно скопировать и вставить ее в среду B;
К сожалению, envir-A и envir-B не связаны (нет взаимного доступа), поэтому я думаю о способе кодирования / декодирования для его представления, иначе для большего количества файлов мне придется вводить строку вручную --- -которая медленная и невоспроизводимая.
Любое предложение или гаджет порекомендуете? Большое спасибо!
У меня возникла странная проблема с кодированием СУПЕР ДЛИННЫХ двоичных файлов в простую форму, например, несколько цифр.
Скажем, есть длинная строка, состоящая только из 1 и 0, например «110 ... 011» длиной от 1000 до 100000 или даже больше цифр, и я хотел бы закодировать эту СТРОКУ во что-то, что имеет меньше цифр / символов. Затем мне нужно вернуть его к исходной STRING.
В настоящее время я пытаюсь использовать метод hex / int в Python, чтобы «сжать» эту строку и «распаковать» ее обратно в исходную форму.
Примером может быть:
1. строка ввода: '110011110110011'
'' '
def Bi_to_Hex_Int(input_str, method ):
#2to16
if method=='hex':
string= str(input_str)
input_two= string
result= hex(int(input_two,2))
#2to10
if method=='int':
string= str(input_str)
input_two= string
result= int(input_two,2)
print("input_bi length",len(str(input_two)), "\n output hex length",len(str(result)),'\n method: {}'.format(method) )
return result
res_16 =Bi_to_Hex_Int(gene , 'hex')
=='0x67b3'
res_10 =Bi_to_Hex_Int(gene , 'int')
== 26547
'' '
Затем я могу отменить его обратно:
'' '
def HexInt_to_bi(input_str , method):
if method =='hex':
back_two = bin(int(input_str,16))
back_two = back_two[2:]
if method =='int':
back_two = bin( int(input_str ))
back_two = back_two[2:]
print("input_hex length",len(str(input_str)), "\n output bi length",len(str(back_two)) )
return back_two
hexback_two = HexInt_to_bi(res_16, 'hex')
intback_two = HexInt_to_bi(res_10 , 'int')
'' '
НО, это проблема, я пробовал около 500 цифр String: 101010 ... 0001 (500d), лучший результат «сжатого» - около 127 цифр в шестнадцатеричном формате;
Так есть ли лучший способ «сжать» строку до меньшего количества цифр?
** Скажем, 5000 цифр строки состоят из единиц и нулей, сжать до 50/100 цифр / символов (даже меньше) ** ??
Ответы
Если вы хотите, чтобы это было так просто, скажем, 1 шестнадцатеричный символ сжимает 4 двоичных символа (2 ^ 4 = 16). Требуемая степень сжатия составляет примерно 100/50 раз. Для 50 раз вам нужно, чтобы 50 двоичных символов были сжаты в 1 символ, это означает, что вам потребуется 2 ^ 50 разных символов для кодирования любой комбинации. Довольно много.
Если вы согласны с более низким коэффициентом, вы можете попробовать base64, как описано здесь . Степень сжатия 6: 1.
В противном случае вам придется придумать какой-то сложный алгоритм, такой как разделение вашей строки на блоки, поиск похожих между ними, кодирование их разными символами, построение карты этих символов и т. Д.
Вероятно, проще сжать вашу строку с помощью архиватора , а затем вернуть представление результата в формате base64.
Если задача позволяет, вы можете где-то хранить целые строки и давать им короткие уникальные имена, поэтому вместо сжатия и распаковки вам придется сохранять и извлекать строки по именам.
Это, вероятно, не дает самой короткой строки, которую вы можете получить, но это тривиально просто, используя средства, встроенные в Python. Нет необходимости преобразовывать символы в двоичный формат, zlib
сжатие преобразует ввод с двумя разными символами во что-то оптимальное.
Кодировка:
import zlib
import base64
result = base64.b64encode(zlib.compress(input_str.encode()))
Если количество 0
и 1
значительно отличается от того, что вы можете использовать перечислительное кодирование, чтобы получить кратчайшее представление
Если строка состоит только из 0
и 1
цифр, то вы можете упаковать восемь цифр в один байт. Вам также необходимо будет отслеживать, сколько цифр стоит за последним кратным восьми, поскольку последний байт может представлять менее восьми цифр.