Cách tốt nhất để mã hóa một chuỗi nhị phân rất dài thành một biểu mẫu đơn giản có thể hoàn nguyên bằng Python?

Jan 13 2021

-------------------------- thêm mới---------------------- -------

Hãy để tôi điền thêm thông tin ở đây:

Tình hình thực tế là tôi có DÀI DÀI này trong môi trường-A và tôi cần sao chép và dán nó vào môi trường-B;

UNFORTUNATELY, envir-A và envir-B không được kết nối (không có quyền truy cập lẫn nhau), vì vậy tôi đang nghĩ về cách mã hóa / giải mã để đại diện cho nó, nếu không để có thêm tệp, tôi phải nhập chuỗi thủ công --- -mà chậm và không thể tái tạo.

Bất kỳ đề xuất hoặc tiện ích đề xuất? Cảm ơn nhiều!


Tôi đang gặp phải một vấn đề kỳ lạ là mã hóa các mã nhị phân SIÊU DÀI thành một dạng đơn giản, chẳng hạn như một số chữ số.

Giả sử, có một chuỗi dài chỉ bao gồm 1 và 0, ví dụ: "110 ... 011" có độ dài từ 1.000 đến 100.000 hoặc thậm chí nhiều chữ số hơn và tôi muốn mã hóa STRING này thành một thứ gì đó có ít chữ số / ký tự hơn. Sau đó, tôi cần phải đảo ngược nó về STRING ban đầu.

Hiện tại, tôi đang thử sử dụng phương thức hex / int trong Python để 'nén' Chuỗi này và 'giải nén' nó trở lại dạng ban đầu.

Một ví dụ sẽ là:

1. chuỗi đầu vào: '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

''

Sau đó, tôi có thể đảo ngược nó trở lại:

''

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

''

NHƯNG, điều này thực sự có vấn đề, tôi đã thử khoảng 500 chữ số của Chuỗi: 101010 ... 0001 (500d), kết quả 'nén' tốt nhất là khoảng 127 chữ số bằng hex;

Vậy có cách nào tốt hơn để tiếp tục 'nén' chuỗi thành ít chữ số hơn không?

** Giả sử 5.000 chữ số của chuỗi bao gồm 1s & 0s, nén thành 50/100 cái gì đó của chữ số / ký tự (thậm chí thấp hơn) ** ??

Trả lời

1 Som-1 Jan 13 2021 at 19:19

Nếu bạn muốn nó đơn giản như vậy, giả sử 1 ký tự hex nén 4 ký tự nhị phân (2 ^ 4 = 16). Tỷ lệ nén bạn muốn là khoảng 100/50 lần. Đối với 50 lần, bạn cần 50 ký tự nhị phân được nén thành 1 ký tự, có nghĩa là bạn cần 2 ^ 50 ký tự khác nhau để mã hóa bất kỳ tổ hợp nào. Khá nhiều đó là.

Nếu bạn chấp nhận tỷ lệ thấp hơn, bạn có thể thử base64 như được mô tả ở đây . Tỷ lệ nén của nó là 6 trên 1.

Nếu không, bạn phải nghĩ ra một số thuật toán phức tạp như chia chuỗi của bạn thành các khối, tìm kiếm sự tương tự giữa chúng, mã hóa chúng bằng các ký hiệu khác nhau, xây dựng bản đồ của các ký hiệu đó, v.v.

Có lẽ sẽ dễ dàng hơn để nén chuỗi của bạn bằng một trình lưu trữ , sau đó trả về một biểu diễn base64 của kết quả.

Nếu nhiệm vụ cho phép, bạn có thể lưu trữ toàn bộ chuỗi ở đâu đó và đặt cho chúng những tên ngắn duy nhất, vì vậy thay vì nén và giải nén, bạn phải lưu trữ và truy xuất chuỗi theo tên.

1 MarkRansom Jan 14 2021 at 01:52

Điều này có thể không tạo ra chuỗi ngắn nhất tuyệt đối mà bạn có thể nhận được, nhưng nó rất dễ dàng bằng cách sử dụng các cơ sở được tích hợp trong Python. Không cần phải chuyển đổi các ký tự thành định dạng nhị phân, zlibnén sẽ chuyển đổi đầu vào chỉ có 2 ký tự khác nhau thành một thứ gì đó tối ưu.

Mã hóa:

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

Nếu số lượng 0và số lượng 1khác nhau đáng kể, bạn có thể sử dụng mã hóa kiểu liệt kê để có được biểu diễn ngắn nhất

MarkAdler Jan 14 2021 at 01:32

Nếu chuỗi bao gồm chỉ số 01chữ số, sau đó bạn có thể đóng gói tám chữ số vào một byte. Bạn cũng sẽ cần theo dõi xem có bao nhiêu chữ số vượt qua bội số cuối cùng của tám, vì byte cuối cùng có thể đại diện cho ít hơn tám chữ số.