Лучший способ закодировать очень длинную строку двоичных файлов в простую с возможностью возврата форму с помощью Python?

Jan 13 2021

-------------------------- Добавить новое---------------------- -------

Позвольте мне ввести дополнительную информацию здесь:

Фактическая ситуация такова, что у меня есть эта ДЛИННАЯ СТРОКА в среде 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 Som-1 Jan 13 2021 at 19:19

Если вы хотите, чтобы это было так просто, скажем, 1 шестнадцатеричный символ сжимает 4 двоичных символа (2 ^ 4 = 16). Требуемая степень сжатия составляет примерно 100/50 раз. Для 50 раз вам нужно, чтобы 50 двоичных символов были сжаты в 1 символ, это означает, что вам потребуется 2 ^ 50 разных символов для кодирования любой комбинации. Довольно много.

Если вы согласны с более низким коэффициентом, вы можете попробовать base64, как описано здесь . Степень сжатия 6: 1.

В противном случае вам придется придумать какой-то сложный алгоритм, такой как разделение вашей строки на блоки, поиск похожих между ними, кодирование их разными символами, построение карты этих символов и т. Д.

Вероятно, проще сжать вашу строку с помощью архиватора , а затем вернуть представление результата в формате base64.

Если задача позволяет, вы можете где-то хранить целые строки и давать им короткие уникальные имена, поэтому вместо сжатия и распаковки вам придется сохранять и извлекать строки по именам.

1 MarkRansom Jan 14 2021 at 01:52

Это, вероятно, не дает самой короткой строки, которую вы можете получить, но это тривиально просто, используя средства, встроенные в Python. Нет необходимости преобразовывать символы в двоичный формат, zlibсжатие преобразует ввод с двумя разными символами во что-то оптимальное.

Кодировка:

import zlib
import base64
result = base64.b64encode(zlib.compress(input_str.encode()))
1 TThoEinthausend Jan 14 2021 at 04:08

Если количество 0и 1значительно отличается от того, что вы можете использовать перечислительное кодирование, чтобы получить кратчайшее представление

MarkAdler Jan 14 2021 at 01:32

Если строка состоит только из 0и 1цифр, то вы можете упаковать восемь цифр в один байт. Вам также необходимо будет отслеживать, сколько цифр стоит за последним кратным восьми, поскольку последний байт может представлять менее восьми цифр.