2017-12-16 2 views
1

내 질문은 정보가 프로세스에서 손실되었을 수있는 경우 원래 문자열을 검색하는 방법에 관한 것입니다. 이 같은 뭔가 바이트 변화를 사용하는 인코딩 루틴을 검토하고 있습니다 :바이트 이동으로 인코딩을 해독하는 가장 좋은 방법

def encode(string): 
    encoded = '' 
    for char in string: 
     encoded += chr(ord(char)^(ord(char) >> 1)) 
    return encoded 

비트 바로 내가 어떤 경우에 정보를 잃어버린있어 이동되는 경우 하나를,하지만 난 방법을 알아 내려고 노력하고있어

In [90]: ord('A') >> 1 << 1 
Out[90]: 64 

In [91]: ord('B') >> 1 << 1 
Out[91]: 66 

In [92]: ord('C') >> 1 << 1 
Out[92]: 66 

이 가능 t 수 있을까요 : 나는 주어진 문자의 목록에 대한 정보를 잃어버린거야으로

def decode(string): 
    decoded = '' 
    for char in string: 
     decoded += ........ 
    return decoded 

방식으로 원래의 문자열을 재구성하기 인코딩 된 문자열을 역순으로? 나는 잠시 동안 내 머리를 도청 해왔다. 나는이 일을 할 수 있다는 생각이 들지만, 내 머리는 여기에 붙어있는 것 같다.

답변

2

최상위 비트를 살펴보십시오. XOR되거나 수정되지 않습니다. 그래서 너는 그것을 안다. 두 번째 최상위 비트는 이미 알고있는 최상위 비트와 XOR됩니다.

따라서이 XOR을 실행 취소하고 두 번째로 높은 비트를 가질 수 있습니다. 모든 비트가 공개 될 때까지 이것을 반복하십시오. 또한 최하위 비트의 정보가 여기에서 손실되지 않습니다. 두 번째 LSB와 XOR됩니다.

가장 효율적인 방법인지는 모르겠지만 인코딩 된 바이트 (eb으로 지정)를 eb >> 1으로 XOR 할 것입니다.

결과

eb2 = eb^eb >> 1 # == char^char >> 2 바이트 char >> 8 == 0 따라서 eb4 == char 들어

다음

eb3 = eb2^eb2 >> 2 # == char^char >> 4 
eb4 = eb3^eb3 >> 4 # == char^char >> 8 

(여기에서 바이트 값 char을 의미)이다.

+0

@StefanPochmann 답변을 –

+0

니스로 업데이트했습니다. 나는 같은 방법을 생각해 냈지만, 당신의 추론은 훨씬 낫습니다. 나는이 방법이 단일 문자 디코딩을 위해 할 수있는 최선의 방법이라고 생각하며 인코딩보다 훨씬 힘들다는 점에 실망했다. 나는 그것을 수리하기보다는 무언가를 깨뜨리는 것이 더 쉽다고 생각합니다 :-). 긴 문자열의 경우 방금 게시 한 것처럼 조회 테이블을 사용하는 것이 더 좋을 것이라고 생각합니다. –

2

마이클의 대답은 가능하고, 여기에 그것을 할 수있는 사소한 아마도 빠른 방법은 (여기 ASCII 일) 역방향 조회 테이블을 사용하여,의 입증 :

def decode(string): 
    return string.translate({i^i>>1: i for i in range(128)}) 

데모 :

>>> encode('StackOverflow') 
'zNQR^hMWKUZXL' 
>>> decode(encode('StackOverflow')) 
'StackOverflow' 

그리고 그것은 작동 사소한 실험 증거 :

>>> len({i^i>>1 for i in range(128)}) 
128 

128 개 가능한 입력은 12으로 이어질 8 개의 서로 다른 출력이 있으므로 두 개의 다른 문자가 동일한 문자로 인코딩되지 않으므로이 과정을 되돌릴 수 있습니다.

관련 문제