Warum gibt es Synchsafe Integer?

7

Ich habe angefangen, MP3-Dateien in C ++ zu lesen.

Alles ging gut, bis ich die Spezifikationen des ID3-Tags gelesen habe. Es gibt einige Informationen in ID3v2-Header über seine Größe in sogenannten Synchsafe Integer gespeichert. Das ist eine 4-Byte-Ganzzahl, bei der das höchstwertige Bit jedes Bytes auf Null gesetzt wird.

Ich habe herausgefunden, wie man es in eine ordentliche Ganzzahl umwandelt, aber ich kann nicht aufhören mich zu fragen, warum ein ganzzahliger Wert auf solch eine unnötige komplizierte Weise gespeichert wird.

Ich hoffe, es gibt jemanden, der mir sagen kann, warum es so gelagert wird.

    
the_mario 07.03.2011, 17:33
quelle

3 Antworten

21

Um zu verstehen, warum sync-sichere Integer verwendet werden, ist es hilfreich, ein wenig über das Format von MP3-Daten sowie darüber, wie eine MP3-Datei von einem Media-Player abgespielt wird, zu verstehen. MP3-Daten werden in einer Datei als eine Reihe von Bildern gespeichert. Jeder Rahmen enthält ein wenig digitale Musik, die im MP3-Format kodiert ist, sowie einige Metadaten über den Rahmen selbst. Zu Beginn jedes MP3-Frames sind 11 Bit (manchmal 12) alle auf 1 gesetzt. Dies wird als Sync bezeichnet, und es ist das Muster, nach dem ein Media-Player sucht, wenn er versucht, eine MP3-Datei oder einen Stream abzuspielen. Wenn der Spieler diese 11-Bit-Sequenz findet, dann weiß er, dass er einen MP3-Rahmen gefunden hat, der dekodiert und wiedergegeben werden kann.

Siehe: www.id3.org/mp3Frame

Wie Sie wissen, enthält ein ID3-Tag Daten über den Track als Ganzes. Ein ID3-Tag - in der Version 2.x und höher - befindet sich am Anfang einer Datei oder kann sogar in einen MP3-Stream eingebettet werden (obwohl dies nicht oft der Fall ist). Der Header eines ID3-Tags enthält ein 32-Bit-Größenfeld, das angibt, wie viele Bytes sich im Tag befinden. Der Maximalwert einer vorzeichenlosen 32-Bit-Ganzzahl kann 0xFFFFFFFF sein. Wenn wir also 0xFFFFFFFF in das Größenfeld schreiben, beanspruchen wir ein wirklich großes Tag (pragmatisch zu groß). Wenn der Player versucht, die Datei oder den Stream abzuspielen, sucht er nach der 11-Bit-Sequenz eines MP3-Datenrahmens, sucht aber stattdessen das Größenfeld im ID3-Tag-Header und versucht, das Tag abzuspielen, da das Größenfeld die ersten 11 hat Bits gesetzt. Das hört sich normalerweise nicht gut an, je nach Musikgeschmack. Die Lösung besteht darin, ein Integer-Format zu erstellen, das keine 11-Bit-Sequenzen aller Einsen enthält. Daher das sync-sichere Integer-Format.

Eine sync-sichere Ganzzahl kann in C / C ++ in eine Ganzzahl konvertiert werden. Verwenden Sie dazu etwa Folgendes:

%Vor%

Hoffe, das hilft.

    
J. Andrew Laughlin 13.04.2011, 16:56
quelle
3

Zusätzlich zu den obigen Antworten möchte ich eine Seite aus meinem Blog hinzufügen: Ссылка

    
phoxis 09.05.2011 17:41
quelle
0
  

6.2. Synchsafe-Ganzzahlen

     

In einigen Teilen des Tags ist es unbequem, das Unsynchronisationsschema zu verwenden, da die Größe nicht synchronisierter Daten nicht im Voraus bekannt ist, was insbesondere bei Größenbeschreibern problematisch ist. Die Lösung in ID3v2 besteht darin, Synchsafe-Ganzzahlen zu verwenden, bei denen es niemals zu falschen Synchronisierungen kommen kann.   Synchsafe-Ganzzahlen sind Ganzzahlen, die ihr höchstes Bit (Bit 7) auf Null setzen, wodurch sieben von acht Bits verfügbar sind. Somit kann eine 32-Bit-Synchsafe-Ganzzahl 28 Bits an Information speichern.

Von Ссылка

Es hängt eng mit dem zusammen, was sie in dem gegebenen Dokument als "Unsynchronisation" bezeichnen. Sie sollten das gesamte Kapitel 6 lesen. All dies steht im Zusammenhang mit der Maximierung der Kompatibilität mit einer breiten Palette von Software und Hardware.

    
krtek 07.03.2011 17:51
quelle

Tags und Links