<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[mp3 header auslesen mit union?]]></title><description><![CDATA[<p>hiho!<br />
Ich möchte die headerframes von mp3 dateien auslesen. Das Problem ist ja bekannterweise, dass der header nicht byte, sondern bitweise die Daten enthällt.</p>
<p>Im netz bin ich auf union gestoßen, allerdings funktioniert es damit nicht richtig. Hier einmal die struct die ich gefunden habe:</p>
<pre><code class="language-cpp">typedef struct T_MP3HEADER{
  union{
    struct{
      unsigned int byte4:8;
      unsigned int byte3:8;
      unsigned int byte2:8;
      unsigned int byte1:8;
    }e;
    struct{
	  unsigned int SyncWord    : 11;
	  unsigned int SyncEndBit  :  2;

	  unsigned int MPEGVersion :  2;
      unsigned int Emphasis    :  2;
      unsigned int Original    :  1;
      unsigned int Copyright   :  1;
      unsigned int Mode_Ext    :  2;
      unsigned int Mode        :  2;
      unsigned int Private     :  1;
      unsigned int Paddig      :  1;
      unsigned int Samplefrq   :  2;
      unsigned int Bitrate     :  4;
      unsigned int Protection  :  1;
      unsigned int MPEGLayer   :  2;

    }a;
  }h;
}MP3HEADER;
</code></pre>
<p>Das erst eine e klasse erzeugt wird ist klar, da somit der zu teilende Speicher quasi festgelegt wird.</p>
<p>Die Zahlen hinter dem Doppelpunkt bedeuten offensichtlich auf wie viel bits diese variable zugriff hat. Problematisch wird es dann wenn man den mp3 header in die struct einliest.<br />
Nix passt. Ich habe das Gefühl, dass die bytes falschrum eingelesen werden. Vergleicht man die werte aus einem hexeditor mit den Werten aus dem debugger stellt man das sofort fest. aus 0xFB74 wird z.B. 0x74FB. Genauso verhällt es sich binär: aus 01 wird 10. Was ist das? Und kann ich es irgendwie wieder &quot;zurückdrehen&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/158538/mp3-header-auslesen-mit-union</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 22:46:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/158538.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 06 Sep 2006 11:58:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to mp3 header auslesen mit union? on Wed, 06 Sep 2006 11:58:26 GMT]]></title><description><![CDATA[<p>hiho!<br />
Ich möchte die headerframes von mp3 dateien auslesen. Das Problem ist ja bekannterweise, dass der header nicht byte, sondern bitweise die Daten enthällt.</p>
<p>Im netz bin ich auf union gestoßen, allerdings funktioniert es damit nicht richtig. Hier einmal die struct die ich gefunden habe:</p>
<pre><code class="language-cpp">typedef struct T_MP3HEADER{
  union{
    struct{
      unsigned int byte4:8;
      unsigned int byte3:8;
      unsigned int byte2:8;
      unsigned int byte1:8;
    }e;
    struct{
	  unsigned int SyncWord    : 11;
	  unsigned int SyncEndBit  :  2;

	  unsigned int MPEGVersion :  2;
      unsigned int Emphasis    :  2;
      unsigned int Original    :  1;
      unsigned int Copyright   :  1;
      unsigned int Mode_Ext    :  2;
      unsigned int Mode        :  2;
      unsigned int Private     :  1;
      unsigned int Paddig      :  1;
      unsigned int Samplefrq   :  2;
      unsigned int Bitrate     :  4;
      unsigned int Protection  :  1;
      unsigned int MPEGLayer   :  2;

    }a;
  }h;
}MP3HEADER;
</code></pre>
<p>Das erst eine e klasse erzeugt wird ist klar, da somit der zu teilende Speicher quasi festgelegt wird.</p>
<p>Die Zahlen hinter dem Doppelpunkt bedeuten offensichtlich auf wie viel bits diese variable zugriff hat. Problematisch wird es dann wenn man den mp3 header in die struct einliest.<br />
Nix passt. Ich habe das Gefühl, dass die bytes falschrum eingelesen werden. Vergleicht man die werte aus einem hexeditor mit den Werten aus dem debugger stellt man das sofort fest. aus 0xFB74 wird z.B. 0x74FB. Genauso verhällt es sich binär: aus 01 wird 10. Was ist das? Und kann ich es irgendwie wieder &quot;zurückdrehen&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1132247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1132247</guid><dc:creator><![CDATA[Perner]]></dc:creator><pubDate>Wed, 06 Sep 2006 11:58:26 GMT</pubDate></item><item><title><![CDATA[Reply to mp3 header auslesen mit union? on Wed, 06 Sep 2006 12:13:31 GMT]]></title><description><![CDATA[<p>Perner schrieb:</p>
<blockquote>
<p>aus 0xFB74 wird z.B. 0x74FB. Genauso verhällt es sich binär: aus 01 wird 10.</p>
</blockquote>
<p>Das bedeutet aber nicht das Gleiche. Bei dem Hexbeispiel werden nur die Bytes &quot;geswappt&quot;. Dass kannst du natürlich einfach wieder rumdrehen:</p>
<pre><code class="language-cpp">int org = MEIN_HEX_WERT;

int swapped = 0 | (org &amp; 0xFF00) &gt;&gt; 8;
swapped |= (org &amp; 0x00FF) &lt;&lt; 8;
</code></pre>
<p>Wenn das binär das Gleiche wär (wie du es sagst), würde z.B. aus 0100 (4) 0010 (2) werden.</p>
<p>edit:<br />
Formatierungsprobleme .. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1132254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1132254</guid><dc:creator><![CDATA[DarthZiu]]></dc:creator><pubDate>Wed, 06 Sep 2006 12:13:31 GMT</pubDate></item></channel></rss>