signed int werte aus unsigned char array lesen

  • Hallo,

    ich versuche aus einem mp3 file die decodierten audiodaten zu extrahieren, verwende hierzu die mpg123 library.

    Die decoding funktion sieht folgendermassen aus:

    Code
    int mpg123_read(mpg123_handle *mh, unsigned char* outmem, size_t memsize, size_t* done)

    Man kann der library vorm öffnen des files das gewünschte encoding format für die audiodaten mitgeben, default ist sie auf 16 bit signed int gesetzt.

    Mein Problem ist es, aus dem unsigned char* array signed int werte zu lesen.

    Da zb auf meinem system ein unsigned char 1 byte und ein signed int 4 bytes belegt, müsste ich logischerweise jeweils 4 unsigned chars aus dem buffer lesen und die
    dann in ein signed int casten.

    Anscheinend kann man das mit bitweisen operatoren lösen, ich komm aber einfach nicht drauf wie ich das gehen soll.

    Hat von euch jemand ne Ahnung wie sowas funktioniert ?

    Einmal editiert, zuletzt von pulse00 (31. August 2008 um 20:07) aus folgendem Grund: titel geändert

  • Wenn ich die Frage korrekt verstanden hab und die Werte im (unsigned char*) Array direkt den (unsigned int*) Werten entsprechen (d.h. wenn der unsigned char* hier nur verwendet wurde um keinen void* zu verwenden) und im Byte Ordering des aktuellen Systems vorliegen könntest du den unsigned char* einfach als unsigned int* interpretieren:

    Code
    unsigned char outmem[];
    unsigned int *lpSource;
    
    
    lpSource = (unsigned int*)(outmem);

    Wenn das Byteordering allerdings nicht dem des aktuellen Systems besteht, müsstest du die einzelnen Bytes (unsigned char) auslesen und mit Bitshift Operatoren sowie logischen Or zu den (unsigned int) zusammensetzen:

    Code
    unsigned int res_i = 
    ((unsigned int)(outmem[i*4+0])) | 
    (((unsigned int)(outmem[i*4+1])) << 8) | 
    (((unsigned int)(outmem[i*4+2])) << 16) |
    (((unsigned int)(outmem[i*4+3])) << 24);

    2 Mal editiert, zuletzt von tsp (2. September 2008 um 23:27)

  • danke für die antwort.

    ich hätte da noch zwei grundlegende fragen:

    wenn ich unsigned char* als unsigned int* interpretiere, wie iteriere ich dann durch die elemente ?

    ich weiss ja nur die anzahl der elemente des unsigned char arrays.

    wäre das dann sowas wie:

    Code
    (for int i = 0; i  < CharArraySize / sizeof(unsigned int); i++)
      unsigned int x = lpSource[i];

    Die zweite frage bezieht sich auf das Byteordering:

    Zitat

    Wenn das Byteordering allerdings nicht dem des aktuellen Systems besteht

    Was genau meinst du damit? Wenn das file auf einem anderen System mit anderem Byteordering geschrieben wurde ?

  • Ja das mit dem Iterieren würde dann so funktionieren. Das Problem mit dem Byte-Ordering betrifft nur Daten die unmodifiziert von anderen Systemen kommen ... da ich die mpg123 Bibliothek leider noch nie verwendet habe bin ich mir nicht sicher ob das eventuell passieren könnte ... Wenn alle Daten von der Bibliothek errechnet werden sollt's damit keine Probleme geben.

  • (...) und mit Bitshit Operatoren (...)


    :rofl: Jo, so ca. sollts gehn. Am besten mal ausprobiern. Wenn alle Daten total vergurkt sind, kannst immer noch a andere Byte Order probiern.;)

    In einen FBO rendern ist wie eine Schachtel Pralinen - man weiß nie, was man kriegt.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!