2017-01-02 1 views
0

파이썬에서 한 번에 데이터 덩어리를 읽음으로써 파일을 파싱합니다. struct.unpack을 사용하여 데이터 덩어리를 정수, 문자열 및 기타 유형이 지정된 구성 요소로 파싱 할 수 있습니다.파이썬은 문자열을 비트 배열로 취급합니다.

데이터의 구조는 64 비트의 이진 데이터와 64 비트의 패딩입니다. 이에 인스턴스

res = struct.unpack('>64s64x', s) 

들어

, I 패딩은 64 비트와 64 비트 길이의 "스트링"내로 구조체를 풀고있다.

나의 주요 목표는 64 비트 "문자열", res [0]을 가져 와서 반전시키는 것입니다. (1에서 0으로 또는 그 반대로 전환)

그러나이 문자열을 비트 배열로 캐스팅하고 처리하는 방법은 무엇입니까?

참고 - "문자열"자체가 이진 데이터의 문자열 표현이 아니기 때문에 res [0]을 인쇄하면 1과 0이 아닌 횡설수설이 잔뜩 나타납니다. 비트 배열이 문자열로 취급되고 있습니다 ...

답변

3

특히 bytes (이는 Python 2에서 str과 같지만 3이 아닙니다)로 해석됩니다. 단지 데이터의 비트를 반전하는 것이 목적이라면, 그것은 매우 쉽습니다. ord()을 사용하여 문자의 int 값을 얻은 다음, bitwise-xor을 0xff과 함께 사용하여 역변환하십시오. (간단한 문자 스트링을 사용합니다.) 예를 들어 문자열로 :

>>> data = 'abcdefgh' 
>>> [ord(x) for x in data] 
[97, 98, 99, 100, 101, 102, 103, 104] 
>>> [ord(x)^0xff for x in data] 
[158, 157, 156, 155, 154, 153, 152, 151] 

그리고 당신은 바이트로 어딘가에 다시 그 데이터를 전달해야하는 경우 : 개별 비트의 값을 확인하려면

result = ''.join(chr(ord(x)^0xff) for x in data) 

, 당신은이 작업을 수행 할 수 있습니다 비트 마스킹 (이것은 C 에서조차도 표준 방법입니다) :

>>> bool(ord('a') & 0x01) 
True 
>>> bool(ord('a') & 0x02) 
False 
>>> bool(ord('a') & 0x04) 
False 
>>> bool(ord('a') & 0x08) 
False 
>>> bool(ord('a') & 0x10) 
False 
>>> bool(ord('a') & 0x20) 
True 
>>> bool(ord('a') & 0x40) 
True 
>>> bool(ord('a') & 0x80) 
False 
+0

설명해 주셔서 감사합니다. 이것은 완벽하게 작동했습니다! – wayway

관련 문제