개발/DICOM 태그 구조 마스터하기

4. Endian 규칙과 바이트 순서 해석 – Little vs Big Endian

devbake 2025. 8. 13. 11:30

DICOM 태그를 이해하는 데 있어서 Group/Element 구조만큼 중요한 것이 엔디언(Endian) 규칙이다. 엔디언은 2바이트 이상의 숫자 데이터를 저장할 때, 바이트를 어떤 순서로 배열하는지를 정하는 방식이다. 의료 영상 파일은 대부분 Little Endian을 기본으로 사용하지만, 장비의 설정이나 전송 규약(Transfer Syntax UID)에 따라 Big Endian으로 저장되기도 한다. 이 경우 동일한 태그 (0010,0010)이라도 hex 편집기에서 보면 전혀 다른 바이트 순서로 나타난다.
이번 글에서는 Little과 Big Endian의 차이를 명확히 정리하고, 실제 DICOM 파일의 바이트 단위 예시를 통해 어떻게 해석해야 하는지 설명한다.

 

Endian 규칙과 바이트 순서 해석 – Little vs Big Endian

1. Endian이란 무엇인가?

  • 정의: 다바이트 이상의 숫자 데이터를 메모리나 파일에 저장하는 순서 규칙
  • 종류:
    • Little Endian: 낮은 바이트 → 높은 바이트 순으로 저장
    • Big Endian: 높은 바이트 → 낮은 바이트 순으로 저장
  • 영향:
    DICOM Tag, Length, 픽셀 데이터 등에서 수치 값이 다르게 보임

 

2. Little Endian – DICOM 기본 규칙

  • 저장 순서: 낮은 바이트부터 기록
  • 예: 0010 → hex 저장: 10 00
  • 장점: Intel 계열 CPU 기본 방식, 성능 최적화
  • DICOM 적용: 대부분의 현대 PACS·뷰어·장비 기본 설정

 

3. Big Endian – 비교적 드문 경우

  • 저장 순서: 높은 바이트부터 기록
  • 예: 0010 → hex 저장: 00 10
  • DICOM 적용: 일부 구형 장비나 특정 전송 규약(Explicit VR Big Endian)에서 사용
  • 주의: 호환성을 위해 변환 작업 필요

 

 

4. 바이트 단위 해석 예시

예시 1 – Little Endian 환경 (0010,0010)

10 00 10 00 50 4E 08 00 48 6F 6E 67 5E 47 44
바이트(16진수) 의미
10 00 Group = 0x0010 (환자 정보)
10 00 Element = 0x0010 (환자 이름)
50 4E VR = "PN"
08 00 Length = 8
이후 값 "Hong^GD "

 

예시 2 – Big Endian 환경 (0010,0010)

00 10 00 10 50 4E 00 08 48 6F 6E 67 5E 47 44

 

바이트(16진수) 의미
00 10 Group = 0x0010
00 10 Element = 0x0010
50 4E VR = "PN"
00 08 Length = 8
이후 값 "Hong^GD "

 

Little vs Big Endian 비교

항목 Little Endian Big Endian
Group(0010) 10 00 00 10
Element(0010) 10 00 00 10
Length(8) 08 00 00 08
VR 동일 (PN) 동일 (PN)

 

 

5. Endian 변환이 필요한 경우

  • 호환성 문제: Big Endian 파일을 Little Endian 환경에서 바로 열면 VR/Length가 잘못 해석됨
  • 변환 방법:
    • DCMTK:
    • dcmconv +te big_endian.dcm little_endian.dcm
    • pydicom:
    • import pydicom
      ds = pydicom.dcmread("big_endian.dcm", force=True)
      ds.is_little_endian = True
      ds.save_as("little_endian.dcm")
    •  

6. 실무 팁

엔디언 규칙은 단순히 태그 번호 해석에만 영향을 주는 것이 아니라, Length 필드, 픽셀 데이터, 심지어 압축 해제 과정까지 연쇄적으로 영향을 미친다. 실무에서 이를 간과하면 PACS 서버, AI 전처리, 연구 데이터셋 준비 과정에서 다음과 같은 문제들이 자주 발생할 수 있다. 

  1. 전송 규약(Transfer Syntax UID) 사전 확인 필수
    • DICOM 메타영역(0002 그룹)에는 전송 규약이 명시되어 있다.
    • 예:
      • 1.2.840.10008.1.2 → Implicit VR Little Endian
      • 1.2.840.10008.1.2.1 → Explicit VR Little Endian
      • 1.2.840.10008.1.2.2 → Explicit VR Big Endian
    • 분석 전 반드시 이 값을 확인하면 불필요한 파싱 오류를 미연에 방지 가능.
  2. 엔디언 불일치 시 발생하는 오류 양상
    • Length 값이 비정상적으로 크게 해석됨 → 이후 모든 태그 위치 엉킴
    • VR 코드가 깨져 보임 → 예: “PN”이 “NP” 또는 무의미한 기호로 표시
    • 픽셀 데이터 크기 오류 → 뷰어에서 영상 깨짐/불러오기 실패
  3. PACS 이관·병합 시 주의
    • 서로 다른 제조사 장비에서 생성된 데이터를 하나의 PACS로 통합할 때,
      일부가 Big Endian이면 변환 과정에서 태그 손실 가능성 있음.
    • 변환 시 데이터 무결성 검증 필수 (해시값 비교 권장).
  4. AI·머신러닝 전처리에서의 엔디언 변환
    • AI 학습 데이터셋을 만들 때,
      서로 다른 엔디언 규칙의 파일이 혼합되면 파이썬 스크립트에서 ValueError 발생.
    • pydicom, SimpleITK 등 라이브러리의 엔디언 변환 옵션 활용 권장.
  5. 자동 변환 파이프라인 구축
    • 대량 변환 작업이 필요한 경우:
      • DCMTK: 속도가 빠르고 안정적, 배치 스크립트 작성 가능
      • GDCM: 다양한 압축 포맷과 엔디언 동시 변환 지원
    • 변환 후, 반드시 무작위 샘플링을 통해 뷰어에서 정상 로드 여부 확인.
  6. Hex 에디터를 통한 빠른 판별 요령
    • 파일 시작부(메타정보 영역)에서 첫 태그 (0002,0000)를 보고,
      2바이트 값이 02 00이면 Little Endian, 00 02이면 Big Endian일 가능성 높음.
    • 단, 일부 파일은 특정 구간만 엔디언이 다를 수 있으므로 전송 규약 확인이 최우선.

 


결론

엔디언 규칙은 DICOM Tag 번호뿐 아니라 Length, 픽셀 데이터까지 영향을 미친다. 특히 Big Endian DICOM을 다룰 때는 바이트 순서를 재배열해야 정상 해석이 가능하다. 이번 내용을 이해하면, hex 편집기에서 태그의 바이트 순서를 보고 파일이 어떤 엔디언 규칙을 쓰는지 바로 판단할 수 있다. 

다음 편에서는 자주 쓰이는 DICOM 태그 TOP 20을 정리해, 실제 Group/Element 번호와 VR, 의미, 예시 값을 함께 제공한다.