2013-06-10 4 views
0

데이터를 고정 길이로 압축 한 다음 압축을 풀 때 데이터의 실제 길이를 언급하지 않고 데이터를 검색 할 수 없습니다.구조 라이브러리의 파이썬에서 데이터 압축 풀기

이전에 길이를 계산하지 않고 \ x00 문자없이 데이터 만 검색하는 방법은 무엇입니까?

>>> import struct 
>>> with open("forums_file.dat", "w") as file: 
    file.truncate(1024) 
>>> country = 'india' 
>>> data = struct.pack('20s', country) 
>>> print data 
    india 
>>> data 
    'india\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
>>> print len(data) 
    20 
>>> unpack_data = struct.unpack('5s', country) 
>>> unpack_data 
    ('india',) 

위의 코드 조각에서는 압축을 풀 때 데이터 길이 (5s)를 언급했습니다.

답변

0

짧은 대답 : 당신은 직접 할 수 없습니다.

길게 대답 :

간접적 인 해결책은 실제로 그렇게 나쁘지 않습니다. 문자열을 풀 때 포장과 동일한 길이를 사용합니다. NUL 문자 (0 바이트)를 포함한 문자열을 반환합니다.

그런 다음 당신은 NUL의 문자에 분할과 같이, 첫 번째 항목을 :

result_with_NUL, = struct.unpack('20s', data) 
print(repr(result_with_NUL)) 

result_string = result_with_NUL.split('\x00', 1)[0] 
print(repr(result_string)) 

split(), 1 매개 변수가 반드시 필요한 것은 아니지만,보다 효율적, 그것은 처음에만 분할로 하나 하나가 아닌 NUL이 발생합니다.

또한 (또는 "="의 목표로 보내고 pack ING와 unpack 다른 시스템과/쓰기 파일이나 교환 데이터를 읽을 때, 그것은 ">"명시 적 "<"와 형식 문자열을 선행하는 것이 중요 또는주의 아주 특별한 경우), 패킹과 언 패킹 모두. 왜냐하면 그렇지 않으면 구조가 정렬되고 패딩 될 것이기 때문입니다. 이것은 시스템 의존성이 크고 나중에 버그를 찾기가 어려울 수 있기 때문입니다.