2010년 6월 한글과 컴퓨터는 한/글의 파일 포맷을 공개했다. 


현재까지의 최신 버전은 2010년 12월에 공개된 1.1


한글과컴퓨터는 한/글 문서의 바이너리 파일(.Hwp) 형식 공개 계획을 밝힌 바 있으며 이를 차질 없이 진행하였으며 Hwp의 XML 포맷인 HwpML의 국가표준(KS)화도 현재 진행되고 있습니다.


그런데, 막상 공개를 하고 나니 많은 프로그래머들이 포맷 공개에 대해 비판했다.

공개된 포맷만으로는 아무런 프로그램도 만들 수 없다는 내용이 주였다.


수년의 세월을 걸쳐 개발한 것을 기껏 공개했더니 반응이 그런 식이라니…




1. 압축 파일의 이유 모를 왜곡


그런데, 이전 포스팅을 작성하기 위해 HwpML(이하 HML)의 자료를 분석하다보니 이상한 점이 발견되었다.

압축을 한 첨부파일의 압축을 해제할 수 없었다.



한/글은 한컴에서 공개한 바와 같이 zlib으로 데이터를 압축한다[각주:1].

그런데, 막상 HML에서 파일을 추출해서 zlib로 압축을 풀려고 하면 잘 되지 않는다.


zlib으로 압축하는 법은 크게 둘로 나뉜다.

compress() 함수를 사용하는 방법과 deflate() 함수를 사용하는 방법.


- 두 방식 공히 맨 앞부분엔 0x78, 0x9C의 두 바이트짜리 헤더가 존재

- 결과는 사실상 동일하며, compress() 는 파일 끝에 원본 파일의 길이를 기록함



그런데, 한/글에서 첨부한 파일에는 앞에서 언급한 헤더를 확인할 수 없다.

게다가, 추가로 확인해본 결과 마지막에 의미 없는 2바이트를 추가했다.


헤더가 이상한 한/글에서 zlib으로 압축했다는 결과


아마도 추측하건데, 두 바이트의 헤더를 감추는 과정[각주:2]에서 저런 어설픈 결과가 나온 것 같다.


이 부분은 정말로 이해가 되지 않는다.

멀쩡히 공개된 형식(BMP 등등)의 데이터를 멀쩡히 공개된 형식으로 압축하면서 왜곡이라니.


어쩌면 포맷 공개를 질질 끌었던 것이 이런 구린 부분들이 많아서 그런 게 아닐까하는 생각도 들었다.



다음글에 계속




  1. 오픈소스에, 속도도 빠르고, 안정적인 라이브러리이니 합리적인 선택임 [본문으로]
  2. 어쨌거나 이해가 안 됨 [본문으로]
신고
  1. kippler 2012.08.14 11:17 신고

    .gz 파일은 [자체 헤더 + deflate 압축데이타 + 파일크기(4bytes)] 로 이루어 집니다.

    이중 자체 헤더는 0x1f, 0x8b 두바이트로 시작이 되고요.


    deflate 압축 알고리즘 자체는 비트스트림으로 되어 있어서 데이타 시작시

    특정한 바이트값이 나오지 않으며, (bzip2 의 경우는 나오죠..)

    끝에 압축된 크기를 저장하지도 않습니다. 아마도, 아래한글은 별도의 헤더 없이

    데이타를 deflate 스트림으로 저장하고, 압축된 정보는 별도로 저장하는듯 합니다.

    • Favicon of http://teus.me BlogIcon BLUEnLIVE 2012.08.14 22:12 신고

      진짜다! 진짜가 나타났다!
      (굽신굽신)

      고맙습니다.
      그런데, deflate()도 0x78, 0x9c 의 헤더를 생성하더군요.

      항상 좋은 프로그램에 감사드립니다. ^^;

  2. 박인창 2012.11.30 13:13 신고

    이러한 데이타도 핸들링하네.
    옛날 생각난다.

+ Recent posts