Il modo migliore per codificare una stringa binaria molto lunga in una forma semplice e reversibile usando Python?

Jan 13 2021

-------------------------- aggiungere nuova---------------------- -------

Lasciami riempire più informazioni qui:

La situazione attuale è che ho questa STRINGA LUNGA nell'ambiente-A e devo copiarla e incollarla nell'ambiente-B;

PURTROPPO, envir-A e envir-B non sono collegati (nessun accesso reciproco), quindi sto pensando a un modo per codificare / decodificare per rappresentarlo, altrimenti per più file devo inserire la stringa mano a mano --- -che è lento e non riproducibile.

Qualche suggerimento o gadget consigliato? Grazie molto!


Sto affrontando uno strano problema per codificare un binario SUPER LUNGO in una forma semplice, come diverse cifre.

Diciamo, c'è una lunga stringa composta solo da 1 e 0, ad esempio "110 ... 011" di lunghezza da 1.000 a 100.000 o anche più cifre, e vorrei codificare questa STRINGA in qualcosa che ha meno cifre / caratteri. Quindi devo riportarlo alla STRING originale.

Attualmente sto provando a utilizzare il metodo hex / int in Python per "comprimere" questa stringa e "decomprimerla" nella forma originale.

Un esempio potrebbe essere:

1.stringa di input: "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

'' '

Quindi posso invertirlo:

'' '

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

'' '

MA, questo ha un problema, ho provato circa 500 cifre della stringa: 101010 ... 0001 (500d), il miglior risultato "compresso" è di circa 127 cifre per esadecimale;

Quindi esiste un modo migliore per "comprimere" ulteriormente la stringa a meno cifre?

** Supponiamo che 5.000 cifre di una stringa siano costituite da 1 e 0, comprimi a 50/100 qualcosa di cifre / caratteri (anche inferiori) ** ??

Risposte

1 Som-1 Jan 13 2021 at 19:19

Se vuoi che sia così semplice, diciamo che 1 carattere esadecimale comprime 4 caratteri binari (2 ^ 4 = 16). Il rapporto di compressione desiderato è di circa 100/50 volte. Per 50 volte sono necessari 50 caratteri binari per essere compressi in 1 carattere, significa che sono necessari 2 ^ 50 caratteri diversi per codificare qualsiasi combinazione. Abbastanza quello è.

Se accetti un rapporto più basso, puoi provare base64 come descritto qui . Il suo rapporto di compressione è 6 a 1.

Altrimenti devi inventare un algoritmo complesso come dividere la tua stringa in blocchi, cercare simili tra loro, codificarli con simboli diversi, costruire una mappa di quei simboli, ecc.

Probabilmente è più facile comprimere la stringa con un archivatore , quindi restituire una rappresentazione base64 del risultato.

Se l'attività lo consente, puoi memorizzare le stringhe intere da qualche parte e dare loro nomi brevi univoci, quindi invece di compressione e decompressione devi memorizzare e recuperare le stringhe per nome.

1 MarkRansom Jan 14 2021 at 01:52

Questo probabilmente non produce la stringa assolutamente più breve che puoi ottenere, ma è banalmente facile usare le funzionalità integrate in Python. Non è necessario convertire i caratteri in un formato binario, la zlibcompressione convertirà un input con solo 2 caratteri diversi in qualcosa di ottimale.

Codifica:

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

Se il conteggio di 0e 1è significativo diverso da quello, è possibile utilizzare la codifica enumerativa per ottenere la rappresentazione più breve

MarkAdler Jan 14 2021 at 01:32

Se la stringa è composta solo da 0e 1cifre, è possibile comprimere otto cifre in un byte. Dovrai anche tenere traccia di quante cifre ci sono oltre l'ultimo multiplo di otto, poiché l'ultimo byte potrebbe rappresentare meno di otto cifre.