1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

signed int werte aus unsigned char array lesen

  • pulse00
  • 31. August 2008 um 20:06
  • Unerledigt
  • pulse00
    4
    pulse00
    Mitglied
    Punkte
    105
    Beiträge
    13
    • 31. August 2008 um 20:06
    • #1

    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

  • tsp
    3
    tsp
    Mitglied
    Punkte
    90
    Beiträge
    15
    • 31. August 2008 um 22:07
    • #2

    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)

  • pulse00
    4
    pulse00
    Mitglied
    Punkte
    105
    Beiträge
    13
    • 31. August 2008 um 23:22
    • #3

    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 ?

  • tsp
    3
    tsp
    Mitglied
    Punkte
    90
    Beiträge
    15
    • 1. September 2008 um 06:34
    • #4

    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.

  • Wolfibolfi
    37
    Wolfibolfi
    Mitglied
    Reaktionen
    186
    Punkte
    14.936
    Beiträge
    2.942
    • 1. September 2008 um 08:27
    • #5
    Zitat von tsp

    (...) 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.

  • pulse00
    4
    pulse00
    Mitglied
    Punkte
    105
    Beiträge
    13
    • 1. September 2008 um 23:34
    • #6

    vielen dank für die hilfe, hat geklappt.

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung