Python을 사용하여 매우 긴 바이너리 문자열을 되돌릴 수있는 간단한 형식으로 인코딩하는 가장 좋은 방법은 무엇입니까?

Jan 13 2021

-------------------------- 새로운 걸 더하다---------------------- -------

여기에 더 많은 정보를 입력하겠습니다.

실제 상황은 환경 A에이 긴 문자열이 있고 환경 B에 복사하여 붙여 넣어야한다는 것입니다.

안타깝게도 envir-A와 envir-B는 연결되어 있지 않으므로 (상호 액세스 없음)이를 표현하기 위해 인코딩 / 디코딩하는 방법에 대해 생각하고 있습니다. 그렇지 않으면 더 많은 파일을 위해 문자열을 직접 입력해야합니다. -느리고 재현 할 수 없습니다.

어떤 제안이나 가제트를 추천합니까? 감사합니다!


SUPER LONG 바이너리를 여러 숫자와 같은 간단한 형식으로 인코딩하는 데 이상한 문제가 있습니다.

예를 들어 길이가 1,000에서 100,000 또는 그 이상의 숫자 인 "110 ... 011"과 같이 1과 0으로 만 구성된 긴 문자열이 있으며이 문자열을 더 적은 숫자 / 문자를 가진 것으로 인코딩하고 싶습니다. 그런 다음 원래 STRING으로 되돌려 야합니다.

현재 파이썬에서 hex / int 메서드를 사용하여이 문자열을 '압축'하고 원래 형식으로 '압축 해제'하려고합니다.

예는 다음과 같습니다.

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

'' '

그러나 이것은 문제가 있습니다. String : 101010 ... 0001 (500d)의 약 500 자리를 시도했습니다. 최상의 '압축'결과는 16 진수로 약 127 자리입니다.

그렇다면 문자열을 더 적은 숫자로 '압축'하는 더 좋은 방법이 있습니까?

** 문자열의 5,000 자리가 1s & 0s로 구성되어 있다고 가정하고, 숫자 / 문자 중 50/100으로 압축 (더 낮은 값) ** ??

답변

1 Som-1 Jan 13 2021 at 19:19

그렇게 간단하게하려면 1 개의 16 진수 문자가 4 개의 이진 문자를 압축한다고 가정합니다 (2 ^ 4 = 16). 원하는 압축 비율은 약 100/50 배입니다. 50 번의 경우 50 개의 이진 문자를 1 개의 문자로 압축해야합니다. 즉, 조합을 인코딩하려면 2 ^ 50 개의 다른 문자가 필요합니다. 꽤 많이 있습니다.

더 낮은 비율을 허용하는 경우 여기에 설명 된대로 base64를 시도 할 수 있습니다 . 압축 비율은 6 : 1입니다.

그렇지 않으면 문자열을 블록으로 분할하고, 그들 사이에서 유사한 것을 찾고, 다른 기호로 인코딩하고, 해당 기호의 맵을 작성하는 등의 복잡한 알고리즘을 찾아야합니다.

아마도 archivator로 문자열을 압축 한 다음 결과의 base64 표현을 반환하는 것이 더 쉬울 것입니다.

작업이 허용하는 경우 전체 문자열을 어딘가에 저장하고 짧은 고유 이름을 지정할 수 있으므로 압축 및 압축 해제 대신 이름으로 문자열을 저장하고 검색해야합니다.

1 MarkRansom Jan 14 2021 at 01:52

이것은 아마도 여러분이 얻을 수있는 가장 짧은 문자열을 생성하지 않을 것입니다.하지만 파이썬에 내장 된 기능을 사용하는 것은 사소한 일입니다. 문자를 이진 형식으로 변환 할 필요가 없습니다. zlib압축은 2 개의 다른 문자 만있는 입력을 최적의 것으로 변환합니다.

부호화:

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

문자열 이 및 숫자 로만 구성된 경우 8 자리 숫자를 1 바이트로 압축 할 수 있습니다. 또한 마지막 바이트가 8 자리 미만을 나타낼 수 있으므로 마지막 8의 배수를 지나서 얼마나 많은 숫자가 있는지 추적해야합니다.01