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, 압축 크기 등 숫자 필드를 얻습니다.
  • 그 뒤 해당 길이만큼 파일 이름/추가 데이터를 슬라이싱하고, 압축 데이터 크기만큼 건너뛰어 다음 헤더를 찾습니다.

← python 3.14으로