ID3TagV2.3.0 Grösse

CodeFatal

Erfahrenes Mitglied
Hi!

Hat jemand von euch vielleicht einen Algorithmus um die Grösse eines ID3V2.3.0 Tags möglichst schnell und effizient zu berechnen.
Die Grösse ist in vier Byte codiert, wobei das bit 7(von jedem Byte) )immer ignoriert wird.

Bsp.:
257byte -> 00 00 02 01 (Hex)

Gruss Michael
 
Also ich würde das einfach so machen: Wenn ich die Struktur des ID Tags kenne (und du musst sie ja kennen, sonst ist alles andere ja sinnlos), dann weiß ich durch sizeof() die Größe der Struktur. Auf 32 Bit Maschinen kann dir folgende Tabelle in C/C++ helfen:

char = 1 Byte
short = 2 Byte
int = 4 Byte
__int32 = 4 Byte (Win32)
long = 4 Byte (Win32)
__int64 = 8 Byte (Win32)
float = 4 Byte
double = 8 Byte
long double = 8 Byte (Win32)
bool = 1 Byte (Win32)

Vorsicht bei statischen Arrays innerhalb von Strukturen! Diese Struktur

Code:
struct s
   {
   	char array[5];
   };

ergibt bei sizeof(s) genau 5 Bytes. Dagegen diese:

Code:
struct s
    {
    	char array[5];
   	int i;
    };
schon 12 Bytes. Das kommt durch das Byte Alignment, d.h. ein statisches Array richtet sich in diesem Fall nach dem Bytevermögen des größten Datentyps innerhalb der Struktur, in diesem Fall das int mit 4 Bytes. 5 chars benötigen daher 8 Bytes Speicherplatz plus die 4 Bytes vom int ergibt 12 Bytes. Ein bißchen detaillierter:

int gibt 4 Bytes als größter Datentyp der Struktur vor:

1 bis 4 char Felder benötigen ganze 4 Bytes
5 bis 8 char Felder benötigen 2 * 4 Bytes = 8 Bytes
9 bis 12 char Felder benötigen 3 * 4 Bytes = 12 Bytes
usw.

Wäre der größte Datentyp double (8 Bytes), wäre das Alignment eben 8 Bytes. Byte Alignment ist wichtig beim direkten Lesen und Schreiben von zusammengesetzten Datentypen aus bzw. in binären Dateien.

Soviel kurz dazu. :)

Also besorge dir mal ne Definition der Struktur des ID Tags, implementiere sie und lasse sizeof() mal drüberfahren. Dann weißt du, wie groß sie ist. Übrigens muß Struktur nicht gleich struct sein, darf auch class bedeuten...
 
Zuletzt bearbeitet:
Hi!
Danke für die "kurze" Antwort.
Wenn ich die richtig verstanden habe ist sie nur nicht die für meine Frage. Wollte nicht wissen, wieviel Platz die vier Byte brauchen, sondern welche Zahl darin codiert ist.

Hab mir auch nochmal Gendanken gemacht und bin zu folgendem gekommen.

Code:
TagSize = Header[6]*2097152
		+ Header[7]*16384
		+ Header[8]*128
		+ Header[9];

Gruss Michael
 
Hi,

und genau das geht am einfachsten, wenn man die Struktur kennt und den Datenbestand, der dort gespeichert ist. Es muß doch irgendwo eine Beschreibung des Headers geben. Deine Vorgehensweise halte ich für sehr fehlerträchtig und aussagelos. Ein Haufen Bytes, wo ist denn da zu erkennen, wo was wie gespeichert worden ist? Ich hoffe, du verstehst worauf ich hinaus möchte ;)
 
Hi!

versteh vielleicht nicht ganz worauf du hinaus möchtest. deswegen vielleicht die Fage nochmal anderes.

Gegeben:
Vier Byte: xx xx xx xx(Hex)

Aufbau jedes Bytes: 0yyy yyyy(Bin) und damit immer kleiner 0x80

Macht insgesamt:
0yyy yyyy 0yyy yyyy 0yyy yyyy 0yyy yyyy(Bin)

interpretiert wird es aber ohne Nullen:
yyy yyyy yyy yyyy yyy yyyy yyy yyyy(Bin)

Nehmen wir an dieser Stelle ein Beispiel:
00 00 02 01(Hex)->0000 0000 0000 0000 0000 0010 0000 0001(Bin)
interpretiert als
000 0000 000 0000 000 0010 000 0001(Bin)->10 000 0001(Bin)=2^8+1=257(Dez)(grösse des Tags in Byte)

Das ganze hat also erstmal nichts mit Strukturen zu tun.

Gibt es einen nicht Fehler anfälligen und schnellen Algorithmuss der mir die Zahl am Ende berechnet?
 
Zurück