태그 보관물: 꿀뷰

HV3 파일의 구조

세 번째 연타로 쓰는 HV3 시리즈.
혹시라도 HV3 파일 파서나 여튼 비슷한 작업을 하고 싶은 사람(있을지는 모르겠지만…)은 사용하면 좋을 것이다.

단순히 HV3 파일을 풀어주는게 필요한 사람은 이쪽을 보면 된다.
http://koasing.tistory.com/116

1. Container & Attribute 구조

Kipple. 씨는 HV3 구조가 XML과 비슷하다고 하였다.
그런데 난 XML 구조를 모른다 -.- 전공도 아니고 아직까지 써 본 적도 없으니까.

각설, 여튼 HV3 구조를 설명하기 전에 컨테이너와 속성의 구조를 설명하겠다.
(개념이 아니다. 개념은 안드로메다네이버 사전에서 검색해보는게 빠를 것이다.)
(뭐 이 문서를 이해할 정도의 수준이라면 이미 저 둘의 개념 정도는 잡혀 있겠지…)

모든 데이터는 Little Endian으로 기록된다. 어짜피 PC에서 사용할 목적이라 그런 것 같다.

1. 컨테이너
컨테이너는 데이터를 구분하는 단위이며, 파일 데이터를 제외한 모든 정보는 컨테이너의 속성 부분에 기록된다.

char TYPE[4] : 컨테이너 종류를 기술하는 매직 워드이다. Null Termination은 사용하지 않는다.
int ATTRIBUTE_LENGTH : 속성 필드의 전체 길이를 기술한다. 각 속성들의 헤더 길이도 포함한다.
int CONTAINER_LENGTH : 하위 컨테이너들의 전체 길이를 기술한다. 각 컨테이너들의 헤더 길이도 포함한다.
int RAW_DATA_LENGTH : 속성이나 컨테이너가 아닌, 진짜 막바로 저장되는 데이터의 길이이다.
char ATTRIBUTES[ATTRIBUTE_LENGTH] : 이 컨테이너의 속성 필드들이 기록된다.
char CONTAINERS[CONTAINER_LENGTH] : 이 컨테이너의 하위 컨테이너들이 기록된다.
char RAW_DATA[RAW_DATA_LENGTH] : 이 컨테이너에 속하는 데이터가 기록된다.

이 때 ATTRIBUTE_LENGTH, CONTAINER_LENGTH는 기록되는 전체 길이, 즉 속성과 하위 컨테이너의 헤더 길이를 포함함에 주의해야 한다.

2. 속성
속성은 컨테이너에 속하는 데이터 중 정형화되어 있는 데이터를 말한다. 하나의 컨테이너는 여러 개의 속성을 가질 수 있으며, 속성 헤더에 각 속성의 종류와 길이를 저장함으로써 데이터를 구분한다.
데이터로 문자열을 저장할 때 반드시 Null Termination을 사용하는 것 같지는 않다. 하지만 가급적 써 주는 것이 디코더의 호환성 문제를 해결하는데 도움이 될 것이다. 또한 문자열 저장에는 UTF-16LE를 사용한다. 뭔지 모르겠다고? Just google it.

char TYPE[4] : 속성 종류를 기술하는 매직 워드이다. Null Termination은 사용하지 않는다.
int LENGTH : 속성 데이터의 길이를 기록한다. TYPE, LENGTH는 계산에 넣지 않으며 순수 데이터의 길이만 기록한다.
char DATA[LENGTH] : 이 속성의 데이터를 기록한다.


2. Container & Attribute 목록

현재까지 알려진 컨테이너와 속성의 TYPE 목록이다. 꿀뷰가 업그레이드됨에 따라서 추가되는 필드가 존재할 수 있으며, 보고되는 대로 업데이트할 지는 모른다(…) 내키면 하고 아니면 말고.
XML에 해당하는 만큼, 컨테이너와 속성 순서는 아마 바뀌어도 상관 없을 것 같지만, 테스트해 보지는 않았다. 가급적 이 문서에 있는 순서를 지키도록 한다. 또, 매직 워드는 대문자로 기록하도록 한다. 역시 소문자로 바꿔서 테스트해 보지는 않았다. 데이터가 없는 경우에는 컨테이너나 속성을 기록하지 않는다. 기록했을 때의 동작여부 또한 테스트해 보지 않았다.

HV30 c HV3 파일 최상위 컨테이너이다.
VERS a HV3 버전을 저장한다. 현재는 HV3Maker의 버전을 대신 사용한다.
FSIZ a HV3 파일의 전체 크기를 저장한다. 스트리밍때 필요한 듯.
HEAD c 헤더 데이터 컨테이너
GUID a Global Unique ID
UUID a Univiersal Unique ID
FTIM a File Timestamp
DIRE a 제본방향. int형 데이터로 1=좌->우(국내 출판방식) 2=좌<-우(일본 출판방식)
TITL a 제목
ISBN a ISBN을 저장한다. 문자열로 저장하므로 주의할 것.
WRTR a 작가
PUBL a 출판사
DATE a 출판일
GENR a 장르
COPY a 저작권 표기
LINK a 웹 링크 데이터가 있다면 URI를 기록한다.
MAKR a HV3 포맷으로 만든 사람
COMT a 기타 코멘트
LIST c 파일 리스트 컨테이너
FINF c 파일 하나의 정보를 저장하는 컨테이너
NAME a 파일 이름. 상대 경로를 포함할 수 있다.
POS4 a HV3 파일 내에서의 절대 위치. FILE 컨테이너의 시작부분을 가리킨다.
SIZE a 파일 크기. FILE 컨테이너의 크기가 아니므로 주의할 것.
CRC3 a CRC32 데이터
MTIM a File Timestamp
BODY c 파일 전체를 담는 컨테이너
FILE c 하나의 파일을 담는 컨테이너. RAW_DATA로 이미지 파일을 담는다.

HV3 해제기

윈도우판 나왔음. http://koasing.tistory.com/116 참고하세요.

hv4dec.zip

파일명이 HV4인 이유는, 버전을 착각해서일 뿐(…)입니다.

Kipple.씨가 만든 꿀뷰라는 프로그램은 꽤나 유명한 이미지 보기 프로그램입니다.
꿀뷰가 버전 3으로 업그레이드되면서 이런저런 변화가 생겼지만, 대표적인 것이 HV3 라는 전용 포맷을 도입했다는 점입니다.
그런데 꿀뷰가 이 바닥에서나 유명한 탓에, HV3을 풀어주는 프로그램이 없는 실정.

물론 Kipple.씨가 만든 다른 프로그램인 술집에서 풀기를 지원하지만, 이건 천원짜리 유료 프로그램인 탓에 사용 저항이 큽니다.
여튼 한 번쯤 뜯어볼까 하던 차에, 파코즈 쪽에서 마침 논란이 되어 만들어 봤습니다.

주의사항.

펼쳐라

1. 프로그램은 콘솔에서 작동합니다. 첫 번째 인자로 hv3 파일명을 넣어주면 됩니다.
2. 상용 버전은 아니고 그냥 간단히 짠 것이기 때문에, 경우에 따라서는 불안정하게 작동할 수 있습니다.
2. (대표적으로, 필드에 일본어가 들어가 있으면 출력이 깨집니다. 물론 파일은 잘 나옵니다 -_-;;;)
3. 개발환경은 VS2005이며, 실행에 닷넷 프레임워크 2.0이 필요할 수 있습니다.
4. 고착화된거 푸는 방법도 찾았지만, 개발의도를 존중해서 구현하지는 않았습니다.
4. 정 필요하시면 직접 분석하고 만들어서 혼자 쓰시면 되겠습니다.

접어라