Python kullanarak çok uzun bir ikili dizeyi geri döndürülebilir basit bir forma kodlamanın en iyi yolu?

Jan 13 2021

-------------------------- yeni ekle---------------------- -------

Buraya daha fazla bilgi girmeme izin verin:

Gerçek durum, bu UZUN DİZE-A ortamında sahip olduğum ve bunu-B ortamına kopyalayıp yapıştırmam gerektiğidir;

RAHATSIZ OLARAK, envir-A ve envir-B birbirine bağlı değil (karşılıklı erişim yok), bu yüzden onu temsil etmek için kodlamanın / kod çözmenin bir yolunu düşünüyorum, aksi takdirde daha fazla dosya için dizeyi elle girmem gerekiyor --- -bu yavaş ve tekrarlanamaz.

Herhangi bir öneri veya gadget öneriyor mu? Çok teşekkürler!


SÜPER UZUN bir ikiliyi birkaç basamak gibi basit bir biçime kodlamak için tuhaf bir problemle karşı karşıyayım.

Diyelim ki, sadece 1 ve 0'dan oluşan uzun bir dizge var, örneğin "110 ... 011" uzunlukta 1.000 ila 100.000 veya daha fazla basamak var ve bu STRING'i daha az basamak / karakter içeren bir şeye kodlamak istiyorum. O zaman orijinal STRING değerine geri döndürmem gerekiyor.

Şu anda Python'da bu String'i 'sıkıştırmak' ve onu orijinal forma 'açmak' için hex / int yöntemini kullanmaya çalışıyorum.

Bir örnek şöyle olabilir:

1. giriş dizesi: '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

'' '

O zaman geri döndürebilirim:

'' '

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

'' '

AMA, bunda bir sorun var, ben yaklaşık 500 basamaklı String: 101010 ... 0001 (500d) denedim, en iyi 'sıkıştırılmış' sonuç yaklaşık 127 basamaklı hex;

Öyleyse, dizeyi daha az basamağa 'sıkıştırmanın' daha iyi bir yolu var mı?

** Diyelim ki 5.000 basamaklı dizge 1'ler ve 0'lardan oluşuyor, 50/100 sayı / karakter (daha da düşük) sıkıştırın ** ??

Yanıtlar

1 Som-1 Jan 13 2021 at 19:19

Bu kadar basit istiyorsanız, diyelim ki 1 onaltılık karakter 4 ikili karakteri sıkıştırır (2 ^ 4 = 16). İstediğiniz sıkıştırma oranı yaklaşık 100/50 katıdır. 50 kez 1 karaktere sıkıştırılacak 50 ikili karaktere ihtiyacınız vardır, bu da herhangi bir kombinasyonu kodlamak için 2 ^ 50 farklı karaktere ihtiyacınız olduğu anlamına gelir. Bu oldukça fazla.

Daha düşük oranı kabul ederseniz, burada anlatıldığı gibi base64'ü deneyebilirsiniz . Sıkıştırma oranı 6'ya 1'dir.

Aksi takdirde, dizinizi bloklara bölmek, aralarında benzer aramak, farklı sembollerle kodlamak, bu sembollerin bir haritasını oluşturmak gibi karmaşık bir algoritma bulmanız gerekir.

Muhtemelen dizenizi bir arşivleyici ile sıkıştırmak ve ardından sonucun bir base64 temsilini döndürmek daha kolaydır .

Eğer görev izin veriyorsa, tüm dizeleri bir yerde saklayabilir ve onlara kısa benzersiz isimler verebilirsiniz, bu nedenle sıkıştırma ve açma yerine dizeleri adlarına göre saklamanız ve almanız gerekir.

1 MarkRansom Jan 14 2021 at 01:52

Bu muhtemelen elde edebileceğiniz kesinlikle en kısa dizgiyi oluşturmaz, ancak Python'da yerleşik olan olanakları kullanmak çok kolaydır. Karakterleri ikili biçime dönüştürmeye gerek yoktur, zlibsıkıştırma yalnızca 2 farklı karakter içeren bir girişi en uygun olana dönüştürecektir.

Kodlama:

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

Sayısı 0ve 1sizden önemli ölçüde farklıysa, en kısa gösterimi elde etmek için numaralandırmalı kodlamayı kullanabilirsiniz.

MarkAdler Jan 14 2021 at 01:32

Dize oluşuyorsa sadece bir 0ve 1basamak, o zaman bir bayt içine sekiz basamak paketi olabilir. Ayrıca, son bayt sekiz rakamdan daha azını temsil edebileceğinden, sekizin son katını geçen kaç basamak olduğunu da izlemeniz gerekecektir.