본문 바로가기
파이썬

파이썬 바이너리 파일을 구조체로 읽기

by º기록 2021. 1. 29.
반응형

형식 / 구조가 알려진 바이너리 파일이 있습니다.

모든 이진 데이터를 구조의 배열로 읽으려면 어떻게해야합니까?

비슷한 것 (의사 코드)

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

 

 

반응형

댓글