tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
515
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von CodeFatal
    CodeFatal CodeFatal ist offline Mitglied Platin
    Registriert seit
    Oct 2004
    Beiträge
    509
    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
     

  2. #2
    Kriz Kriz ist offline Mitglied Bronze
    Registriert seit
    Dec 2004
    Beiträge
    36
    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 :
    1
    2
    3
    4
    
    struct s
       {
        char array[5];
       };

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

    Code :
    1
    2
    3
    4
    5
    
    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...
    Geändert von Kriz (10.02.05 um 18:24 Uhr)
     

  3. #3
    Avatar von CodeFatal
    CodeFatal CodeFatal ist offline Mitglied Platin
    Registriert seit
    Oct 2004
    Beiträge
    509
    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 :
    1
    2
    3
    4
    
    TagSize = Header[6]*2097152
            + Header[7]*16384
            + Header[8]*128
            + Header[9];

    Gruss Michael
     

  4. #4
    Kriz Kriz ist offline Mitglied Bronze
    Registriert seit
    Dec 2004
    Beiträge
    36
    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
     

  5. #5
    Avatar von CodeFatal
    CodeFatal CodeFatal ist offline Mitglied Platin
    Registriert seit
    Oct 2004
    Beiträge
    509
    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?
     

Ähnliche Themen

  1. grösse anzeigen
    Von Mathias_1_2 im Forum PHP
    Antworten: 0
    Letzter Beitrag: 27.03.05, 21:28
  2. grösse
    Von Mathias_1_2 im Forum HTML & XHTML
    Antworten: 1
    Letzter Beitrag: 12.02.05, 00:08
  3. datei grösse
    Von netrobot im Forum Java
    Antworten: 5
    Letzter Beitrag: 03.09.04, 16:23
  4. grösse
    Von freekazoid im Forum HTML & XHTML
    Antworten: 1
    Letzter Beitrag: 06.06.02, 15:01
  5. Grösse Verändern
    Von Sniff im Forum Sonstige Grafik-Programme
    Antworten: 1
    Letzter Beitrag: 19.08.01, 12:08