Cara terbaik untuk menyandikan string biner yang sangat panjang menjadi bentuk sederhana yang dapat dikembalikan menggunakan Python?

Jan 13 2021

-------------------------- tambah baru---------------------- -------

Izinkan saya mengisi info lebih lanjut di sini:

Situasi sebenarnya adalah saya memiliki LONG STRING ini di lingkungan-A, dan saya perlu menyalin dan menempelkannya ke lingkungan-B;

SANGATNYA, envir-A dan envir-B tidak terhubung (tidak ada akses timbal balik), jadi saya memikirkan cara untuk menyandikan / mendekode untuk mewakilinya, jika tidak untuk lebih banyak file saya harus memasukkan string secara manual --- -yang lambat dan tidak dapat direproduksi.

Ada saran atau gadget yang direkomendasikan? Terimakasih banyak!


Saya menghadapi masalah aneh untuk menyandikan binari SUPER LONG ke bentuk sederhana, seperti beberapa digit.

Katakanlah, ada string panjang yang hanya terdiri dari 1 dan 0, misalnya "110 ... 011" dengan panjang 1.000 hingga 100.000 atau bahkan lebih banyak digit, dan saya ingin menyandikan STRING ini ke sesuatu yang memiliki lebih sedikit digit / karakter. Lalu saya perlu mengembalikannya ke STRING semula.

Saat ini saya mencoba menggunakan metode hex / int dengan Python untuk 'mengompres' String ini, dan 'mendekompresi' kembali ke bentuk aslinya.

Contohnya adalah:

1. string masukan: '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

'' '

Lalu saya bisa membalikkannya kembali:

'' '

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

'' '

TAPI, ini memang bermasalah, saya mencoba sekitar 500 digit String: 101010 ... 0001 (500d), hasil 'terkompresi' terbaik adalah sekitar 127 digit dengan hex;

Jadi, adakah cara yang lebih baik untuk lebih 'memampatkan' string menjadi lebih sedikit digit?

** Katakanlah 5.000 digit string terdiri dari 1s & 0s, kompres menjadi 50/100 sesuatu dari digit / karakter (bahkan lebih rendah) ** ??

Jawaban

1 Som-1 Jan 13 2021 at 19:19

Jika Anda ingin sesederhana itu, katakanlah 1 karakter hex mengompresi 4 karakter biner (2 ^ 4 = 16). Rasio kompresi yang Anda inginkan sekitar 100/50 kali. Untuk 50 kali Anda membutuhkan 50 karakter biner untuk dikompresi menjadi 1 karakter, berarti Anda memerlukan 2 ^ 50 karakter berbeda untuk menyandikan kombinasi apa pun. Cukup banyak.

Jika Anda menerima rasio yang lebih rendah, Anda dapat mencoba base64 seperti yang dijelaskan di sini . Rasio kompresnya adalah 6 banding 1.

Jika tidak, Anda harus membuat beberapa algoritma kompleks seperti membagi string Anda menjadi blok, mencari yang serupa di antara mereka, mengkodekannya dengan simbol yang berbeda, membangun peta simbol-simbol itu, dll.

Mungkin lebih mudah untuk mengompresi string Anda dengan archivator , lalu mengembalikan representasi base64 dari hasilnya.

Jika tugas memungkinkan, Anda dapat menyimpan seluruh string di suatu tempat dan memberinya nama unik yang pendek, jadi alih-alih kompresi dan dekompresi, Anda harus menyimpan dan mengambil string berdasarkan nama.

1 MarkRansom Jan 14 2021 at 01:52

Ini mungkin tidak menghasilkan string terpendek yang bisa Anda dapatkan, tetapi sangat mudah menggunakan fasilitas yang dibangun ke dalam Python. Tidak perlu mengubah karakter menjadi format biner, zlibkompresi akan mengubah input yang hanya memiliki 2 karakter berbeda menjadi sesuatu yang optimal.

Pengkodean:

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

Jika jumlah 0dan 1berbeda signifikan, Anda dapat menggunakan pengkodean enumeratif untuk mendapatkan representasi terpendek

MarkAdler Jan 14 2021 at 01:32

Jika string hanya terdiri dari 0dan 1digit, maka Anda dapat mengemas delapan digit menjadi satu byte. Anda juga perlu melacak berapa banyak digit yang ada setelah kelipatan delapan terakhir, karena byte terakhir mungkin mewakili kurang dari delapan digit.