반응형
형식 / 구조가 알려진 바이너리 파일이 있습니다.
모든 이진 데이터를 구조의 배열로 읽으려면 어떻게해야합니까?
비슷한 것 (의사 코드)
bytes = read_file(filename)
struct = {'int','int','float','byte[255]'}
data = read_as_struct(bytes, struct)
data[1]
>>> 10,11,10.1,Arr[255]
수정 :
지금까지의 솔루션 :
data = []
fmt = '=iiiii256i'
fmt_s = '=iiiii'
fmt_spec = '256i'
struct_size = struct.calcsize(fmt)
for i in range(struct_size, len(bytes)-struct_size, struct_size):
dat1= list(struct.unpack(fmt_s, bytes[i-struct_size:i-1024]))
dat2= list(struct.unpack(fmt_spec, bytes[i-1024:i]))
dat1.append(dat2)
data.append(dat1)
해결 방법
struct.unpack('=HHf255s', bytes)
위의 예는 기본 바이트 순서, 부호없는 단락 2 개, 부동 소수점 및 255 자 문자열을 예상합니다.
from itertools import izip_longest, imap
from struct import unpack, calcsize
fmt_s = '=5i'
fmt_spec = '=256i'
size_s = calcsize(fmt_s)
size = size_s + calcsize(fmt_spec)
def chunked(iterable, n, fillvalue=''):
args = [iter(iterable)] * n
return imap(''.join, izip_longest(*args, fillvalue=fillvalue))
data = [unpack(fmt_s, section[:size_s]) + (unpack(fmt_spec, section[size_s:]),)
for section in chunked(bytes, size)]
이렇게하면 목록이 아닌 튜플이 생성되지만 다음과 같은 경우 조정하기가 쉽습니다.
data = [list(unpack(fmt_s, section[:size_s])) + [list(unpack(fmt_spec, section[size_s:]))]
for section in chunked(bytes, size)]
참조 페이지 https://stackoverflow.com/questions/14215715
반응형
'파이썬' 카테고리의 다른 글
파이썬 Jinja2 속기 조건부 (0) | 2021.01.29 |
---|---|
파이썬 목록에서 여러 문자를 제거하려면 어떻게해야합니까? (0) | 2021.01.29 |
파이썬 현재 디렉토리에서 모듈을 강제로 가져 오기 (0) | 2021.01.29 |
파이썬 Windows에서 fcntl 대체 (0) | 2021.01.29 |
파이썬 Python : if 문에서 RegEx를 사용하는 방법은 무엇입니까? (0) | 2021.01.29 |
댓글