2011-10-26 2 views
0

저는 최근에 ID3v2.4.0에서 작업하고 있습니다. 2.4.0 문서를 읽고, 이해할 수없는 특정 부분, 즉 sync-safe 정수를 발견했습니다. ID3v2가이 방법을 사용하는 이유는 무엇입니까?왜 동기화 안전 정수입니까?

물론 ID3v2가 ID3 태그를 MPEG 동기화 데이터로 간주하지 않도록 MPEG 디코더를 유지하는 데 사용되는 비동기 방식을 사용하는 이유는 알고 있습니다. 하지만 내가 이해할 수없는 이유는 동기화 방지 대신에 동기화 가능 정수 ($ 00 삽입) 때문입니다.

$ 00을 삽입하는 대신 태그 크기를 표현할 때 sync-safe 정수를 채택하는 이유가 있습니까? 이 두 가지 방법으로 완전히 동일한 효과가 나타납니다.

ID3v2 문서는 동기화되지 않은 데이터의 크기가 미리 알려지지 않았다고 말합니다. 하지만이 문장은 의미가 없습니다. 태그 데이터가 버퍼에 저장되면 문제가있는 문자를 $ FF 00으로 대체 한 후 비동기 데이터의 크기를 알 수 있습니다.

나를 도울 사람이 있습니까?

답변

2

나는 단순함을 전제로하며, 동기화되지 않은/싱크 체계는 mpeg 파일에서 사용될 때만 의미가 있습니다.

4 바이트의 읽기 및 일반 정수로 변환하는 간단하다 다음을 찾아, 그들이 프레임 데이터와 동일한 언 싱크 방식을 사용하는 경우

// pseudo code 
uint32_t size; 
file.read(&size, sizeof(uint32_t)); 
size = (size & 0x0000007F) | 
     ((size & 0x00007F00) >> 1) | 
     ((size & 0x007F0000) >> 2) | 
     ((size & 0x7F000000) >> 3); 

는 별도로 각 바이트를 읽을 필요가있을 것이다 FF00 패턴을 만들고 바이트 단위로 정수를 재구성합니다. 또한, 헤더의 '크기'필드가 비동기 바이트가 삽입되어 가변 바이트 수인 경우 전체 헤더는 가변 바이트 수입니다. 그들에게 '헤더가 항상 10 바이트 크기이며이 모양은 ...'이라고 말하는 것이 더 간단합니다.

ID3v2 문서에는 동기화되지 않은 데이터의 크기가 미리 알려지지 않았다고 나와 있습니다. 그러나 그 진술은 말이되지 않습니다. 태그 데이터가 버퍼에 저장되어 있으면 문제가있는 문자를 $ FF 00로 바꾸기 만하면 비동기 데이터의 크기를 알 수 있습니다.

정확합니다. id3v2 헤더 및 프레임 헤더에 기록 된 크기는 (있는 경우)이 적용된 후 크기가 입니다. 그러나 id3v2는 mp3 이외의 파일에 태그를 지정하는 데 사용할 수 있으므로 동기화하지 않고 프레임 데이터를 쓸 수 있습니다. 여기서 unsync/synch의 개념은 의미가 없습니다. I 어떤 부분 6.2가 mp3 파일인지 여부에 관계없이 ''이거나 프레임이 unsynched/synched로 작성되었다고 생각하면 프레임 크기는 항상 MPEG 동기화 안전 방식으로 '으로 기록됩니다.

ID3v2.4 프레임은 프레임 헤더에 '데이터 길이 표시기'플래그가 설정되어있을 수 있습니다.이 경우 동기화 후 얼마나 큰 버퍼인지 알 수 있습니다. 사양의 섹션 4.1.2를 참조하십시오.

나를 도울 수있는 사람이 있습니까?

준수하는 id3v2 태그 리더를 작성한 사람의 유용한 조언 : 사양을 이해하려고하지 마십시오. 그것은 분명히 미친 사람과 새디스트가 썼다.다시 한번 그걸 보면서 악몽을 퍼붓고 있습니다.