https://docs.python.org/3/tutorial/stdlib2.html#working-with-binary-data-record-layouts
포맷을 알고 있다면 Struct를 이용해 메타데이터를 뽑아 사용할 수 있다.
struct 모듈 쉽게 보기
- struct는 “바이트 배열 ↔ 숫자/문자” 변환기입니다.
- ZIP 같은 바이너리 파일은 특정 순서·크기의 필드로 저장되는데,
- struct.unpack()이 이 바이트 조각을 의미 있는 값으로 바꿔준다.
형식 문자열 읽기
- “<IIIHH”을 예로 들면:
- <: “리틀 엔디언”이라는 바이트 순서를 사용한다는 뜻.
- I: 4바이트 부호 없는 정수.
- H: 2바이트 부호 없는 정수.
- 즉, 위 문자열은 4바이트 정수 3개 + 2바이트 정수 2개를 순서대로 꺼내라는 지시입니다
ZIP 헤더 살펴보기 예시
import struct
with open('myfile.zip', 'rb') as f:
data = f.read()
start = 0
for _ in range(3): # 첫 3개 파일 헤더만 확인
start += 14 # 헤더 앞부분 건너뛰기
crc32, comp_size, uncomp_size, filenamesize, extra_size = struct.unpack('<IIIHH', data[start:start+16])
start += 16
filename = data[start:start+filenamesize]
start += filenamesize
extra = data[start:start+extra_size]
print(filename, hex(crc32), comp_size, uncomp_size)
start += extra_size + comp_size # 다음 헤더 위치로 이동- struct.unpack() 결과를 변수에 바로 할당해 CRC, 압축 크기 등 숫자 필드를 얻습니다.
- 그 뒤 해당 길이만큼 파일 이름/추가 데이터를 슬라이싱하고, 압축 데이터 크기만큼 건너뛰어 다음 헤더를 찾습니다.