<?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[Bytes to Int Funktion liefert seltsame Werte]]></title><description><![CDATA[<p>Hallo,</p>
<p>derzeit beschäftige ich mich damit Audiodaten aus einer Wavefile zu laden.<br />
Dazu habe ich mir eine Hilfsfunktion geschrieben, welche aus n Bytes in Little Endian Format einen entsprechenden (zunächst unsigned) Integerwert bastelt.</p>
<p>Das tue ich wie folgt:</p>
<pre><code>template &lt;unsigned long _bytes,class RandomAccessIterator&gt;
unsigned long BytesToInt(const RandomAccessIterator&amp; it)
{
    unsigned long result(0);
    unsigned long bytes(_bytes);//_bytes is no L-Value therefore a copy is  //needed sadly

    while(bytes--)
    {

        result += *(it+bytes) &lt;&lt; 8*(bytes);//Litte Endian
    }
    return result;

}
</code></pre>
<p>Ich habe meine Waverohdaten (also ohne Header) in einem String gespeichert und wollte die Werte nun in 16 bit signed integer umwandeln.<br />
Mir liefert nun der (sinngemäße) Aufruf:</p>
<pre><code>std::string somewavedata;
for(auto it = somewavedata.begin(); it != somewavedata.end(); advance(it,sizeof(short)))
{
std::cout &lt;&lt; ByteToInt&lt;2&gt;(it) &lt;&lt; std::endl;
}
</code></pre>
<p>Ab und An Werte im Bereich ~ 10^16, was aber 8 Byte von nöten machte.<br />
Da ich aber nur zwei byte aus dem String jeweils auslese frage ich mich, wie es dazu kommen kann, dass ich z.B. den Wert 18446744073709551352 als Rückgabewert der ByteToInt-Funktion erhalte?!<br />
Ich habe auch mal zur Sicherheit in ByteToInt *it erstmal auf unsigned char gecastet mit dem selben Ergebnis.<br />
Wie kann das sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/321438/bytes-to-int-funktion-liefert-seltsame-werte</link><generator>RSS for Node</generator><lastBuildDate>Tue, 21 Jul 2026 12:48:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321438.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Nov 2013 12:59:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bytes to Int Funktion liefert seltsame Werte on Mon, 11 Nov 2013 12:59:51 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>derzeit beschäftige ich mich damit Audiodaten aus einer Wavefile zu laden.<br />
Dazu habe ich mir eine Hilfsfunktion geschrieben, welche aus n Bytes in Little Endian Format einen entsprechenden (zunächst unsigned) Integerwert bastelt.</p>
<p>Das tue ich wie folgt:</p>
<pre><code>template &lt;unsigned long _bytes,class RandomAccessIterator&gt;
unsigned long BytesToInt(const RandomAccessIterator&amp; it)
{
    unsigned long result(0);
    unsigned long bytes(_bytes);//_bytes is no L-Value therefore a copy is  //needed sadly

    while(bytes--)
    {

        result += *(it+bytes) &lt;&lt; 8*(bytes);//Litte Endian
    }
    return result;

}
</code></pre>
<p>Ich habe meine Waverohdaten (also ohne Header) in einem String gespeichert und wollte die Werte nun in 16 bit signed integer umwandeln.<br />
Mir liefert nun der (sinngemäße) Aufruf:</p>
<pre><code>std::string somewavedata;
for(auto it = somewavedata.begin(); it != somewavedata.end(); advance(it,sizeof(short)))
{
std::cout &lt;&lt; ByteToInt&lt;2&gt;(it) &lt;&lt; std::endl;
}
</code></pre>
<p>Ab und An Werte im Bereich ~ 10^16, was aber 8 Byte von nöten machte.<br />
Da ich aber nur zwei byte aus dem String jeweils auslese frage ich mich, wie es dazu kommen kann, dass ich z.B. den Wert 18446744073709551352 als Rückgabewert der ByteToInt-Funktion erhalte?!<br />
Ich habe auch mal zur Sicherheit in ByteToInt *it erstmal auf unsigned char gecastet mit dem selben Ergebnis.<br />
Wie kann das sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364917</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Mon, 11 Nov 2013 12:59:51 GMT</pubDate></item><item><title><![CDATA[Reply to Bytes to Int Funktion liefert seltsame Werte on Mon, 11 Nov 2013 13:01:16 GMT]]></title><description><![CDATA[<p>Achso, ich habe das zwar hier inkonsistent gepostet, aber sizeof(short) ist auf meinem System definitiv 2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364918</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Mon, 11 Nov 2013 13:01:16 GMT</pubDate></item><item><title><![CDATA[Reply to Bytes to Int Funktion liefert seltsame Werte on Mon, 11 Nov 2013 13:16:39 GMT]]></title><description><![CDATA[<p>Wo verwendest du short? Hast du eine 64 Bit Anwendung? Warum tut es ein einfaches memcpy nicht? Warum ueberhaupt Template? Wie liest du den String ein? Warum std::string und nicht std::vector&lt;char&gt;?</p>
<blockquote>
<p>it != somewavedata.end();</p>
</blockquote>
<p>Was wenn du beim Vorruecken um 2 das Ende verfehlst? =&gt; UB?</p>
<pre><code class="language-cpp">*(it+bytes)
</code></pre>
<p>Wird das zu einem unsigned long promotet bevor geshiftet wird?</p>
<p>So viele Fragen und so wenig Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364919</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 11 Nov 2013 13:16:39 GMT</pubDate></item><item><title><![CDATA[Reply to Bytes to Int Funktion liefert seltsame Werte on Mon, 11 Nov 2013 13:42:30 GMT]]></title><description><![CDATA[<p>Na dann mal der Reihe nach:</p>
<p>Template, weil ich es einfach der Übungshalber machen wollte (so simpel es auch sein mag)<br />
Memcpy finde ich super hässlich.</p>
<p>Den String übernehme ich als substring aus dem gesamten Wavefile inkl. header.<br />
Pseudocode:</p>
<pre><code>std::string file;
std::ifstream wavefile(&quot;mywave.wav&quot;,std::ios_base::binary);
wavefile &gt;&gt; std::noskipws;
std::copy(...)-&gt;file
myfile.close();
ReadHeader(file)
wavedata = file.substring(POSITIONWAVEDATA,EOF);
</code></pre>
<p>Ja ich habe eine 64 bit Anwendung.<br />
std::string habe ich nur wegen der bequemen &quot;find()&quot; Methode verwendet, da dies das Auffinden der Wavefelder &quot;RIFF&quot;,&quot;fmt &quot; sowie &quot;data&quot; gestattet.<br />
Beim std::vector&lt;char&gt; hätte ich die erstmal selber schreiben müssen.</p>
<blockquote>
<p>Was wenn du beim Vorruecken um 2 das Ende verfehlst? =&gt; UB?</p>
</blockquote>
<p>Das ist richtig und mir auch bewusst.<br />
Das Laden der Wave ist nur mittel zum zweck(in der späteren Anwendung brauch ich das nicht) um die sound API zu testen d.h. ich brauch nur die rohdaten. (sowie z.B. samplerate, aber das klappt)</p>
<blockquote>
<p>*(it+bytes)<br />
Wird das zu einem unsigned long promotet bevor geshiftet wird?</p>
</blockquote>
<p>Nein. Ich war mir nicht sicher, was passiert wenn man den Wert aus dem Wertebereich des Variablentyps &quot;rausshiftet&quot; konnte bei Tests aber nur das Intuitive verhalten bestätigen (d.h. es wurde augenscheinlich zu einem Typ größerer Wortbreite gecastet).</p>
<p>Die Shorts verwende ich anschließend als Daten für die Audiowiedergabe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364925</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Mon, 11 Nov 2013 13:42:30 GMT</pubDate></item><item><title><![CDATA[Reply to Bytes to Int Funktion liefert seltsame Werte on Mon, 11 Nov 2013 14:20:56 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">*(it+bytes)
</code></pre>
<p>Ist vom Typ char. Wenn 213 drinsteht, dann ist das gleich -23 (oder so). Wird es dann auf long long (64 Bit) erweitert, dann bleibt die negative Zahl erhalten. Castest du dann auf unsigned, dann kommt eine sehr grosse Zahl heraus. * Keine Ahnung, ob shift fuer signed Typen definiert ist. deswegen ja: std::vector&lt;unsigned char&gt; .</p>
<blockquote>
<p>Memcpy finde ich super hässlich.</p>
</blockquote>
<p>Und warum dann nicht std::copy mit (u)char-Pointern? Warum deine selbstgebaute Schleife?</p>
<p>* Angabe ohne Gewaehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364938</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 11 Nov 2013 14:20:56 GMT</pubDate></item><item><title><![CDATA[Reply to Bytes to Int Funktion liefert seltsame Werte on Mon, 11 Nov 2013 15:11:53 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke für deine Hilfe!<br />
Nach deiner &quot;Rückversicherung&quot;, dass es schon sein kann, dass die Werte so groß sind habe ich nochmal weiterprogrammiert und es funktioniert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2364947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364947</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Mon, 11 Nov 2013 15:11:53 GMT</pubDate></item><item><title><![CDATA[Reply to Bytes to Int Funktion liefert seltsame Werte on Tue, 12 Nov 2013 00:06:39 GMT]]></title><description><![CDATA[<p>Binäre Daten in einem <code>std::string</code> zu verwalten ist generell Blödsinn.<br />
(In speziellen Fällen kann es natürlich Sinn machen, aber das hier ist keiner dieser Fälle.)</p>
<p>Und die &quot;fmt &quot; und &quot;data&quot; Chunks in einem RIFF File sucht man ganz sicher nicht mit <code>find()</code> , sondern indem man die Chunk-Struktur parst.<br />
Das RIFF Format ist super-einfach, das hast du in &lt; einer Stunde geschrieben.</p>
<p>Und dein BytesToInt Template hat Undefined Behavior. Die Konvertierung von negativen Werten in unsigned Typen ist nicht definiert.<br />
Wenn du es zum Üben machst, dann mach es ordentlich. Oder willst du üben Undefined Behavior zu produzieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2365039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2365039</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 12 Nov 2013 00:06:39 GMT</pubDate></item><item><title><![CDATA[Reply to Bytes to Int Funktion liefert seltsame Werte on Tue, 12 Nov 2013 00:08:48 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Binäre Daten in einem <code>std::string</code> zu verwalten ist generell Blödsinn.<br />
(Im speziellen Fällen kann es natürlich Sinn machen, aber das hier ist keiner dieser Fälle.)</p>
</blockquote>
<p>wieso ist das blödsinn?</p>
<blockquote>
<p>Und die &quot;fmt &quot; und &quot;data&quot; Chunks in einem RIFF File sucht man ganz sicher nicht mit <code>find()</code> , sondern indem man die Chunk-Struktur parst.<br />
Das RIFF Format ist super-einfach, das hast du in &lt; einer Stunde geschrieben.</p>
</blockquote>
<p>Wie würdest du sie denn parsen?</p>
<blockquote>
<p>Und dein BytesToInt Template hat Undefined Behavior. Die Konvertierung von negativen Werten in unsigned Typen ist nicht definiert.<br />
Wenn du es zum Üben machst, dann mach es ordentlich. Oder willst du üben Undefined Behavior zu produzieren?</p>
</blockquote>
<p>Jo, das habe ich jetzt gefixt. (Wobei es auf dem Testsystem in diesem Fall trotzdem ging :P)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2365040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2365040</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Tue, 12 Nov 2013 00:08:48 GMT</pubDate></item><item><title><![CDATA[Reply to Bytes to Int Funktion liefert seltsame Werte on Tue, 12 Nov 2013 00:30:40 GMT]]></title><description><![CDATA[<p>Namenloser324 schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Binäre Daten in einem <code>std::string</code> zu verwalten ist generell Blödsinn.<br />
(Im speziellen Fällen kann es natürlich Sinn machen, aber das hier ist keiner dieser Fälle.)</p>
</blockquote>
<p>wieso ist das blödsinn?</p>
</blockquote>
<p>Weil std::string &quot;Text&quot; impliziert.</p>
<blockquote>
<blockquote>
<p>Und die &quot;fmt &quot; und &quot;data&quot; Chunks in einem RIFF File sucht man ganz sicher nicht mit <code>find()</code> , sondern indem man die Chunk-Struktur parst.<br />
Das RIFF Format ist super-einfach, das hast du in &lt; einer Stunde geschrieben.</p>
</blockquote>
<p>Wie würdest du sie denn parsen?</p>
</blockquote>
<p>Ja ganz normal halt... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Abgesehen von diversen Überprüfungen sieht das ca. so aus:</p>
<pre><code>ParseRiffFile(range):
    riffSignature = ReadDword(range, 0)
    Assert(riffSignature is 'RIFF')
    riffSize = ReadDword(range, 4)
    ParseListChunkContents(range.SubRange(8, riffSize))

ParseListChunkContents(range):
    listSignature = ReadDword(range, 0)
    EmitListStart(listSignature)
    while (range not empty)
        range = ParseChunk(range)
    EmitListEnd(listSignature)

ParseChunk(range):
    chunkSignature = ReadDword(range, 0)
    chunkSize = ReadDword(range, 4)
    if (chunkSignature is 'RIFF' or chunkSignature is 'LIST')
        ParseListChunkContents(range.SubRange(8, chunkSize))
    else
        chunkData = ReadByteArray(range, 8, chunkSize)
        EmitChunkData(chunkSignature, chunkData)
    evenChunkSize = (chunkSize + 1) &amp; ~1
    return range.SubRange(8 + evenChunkSize, range.Size - 8 - evenChunkSize)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2365042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2365042</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 12 Nov 2013 00:30:40 GMT</pubDate></item><item><title><![CDATA[Reply to Bytes to Int Funktion liefert seltsame Werte on Tue, 12 Nov 2013 01:01:38 GMT]]></title><description><![CDATA[<p>Ok, danke sehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2365046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2365046</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Tue, 12 Nov 2013 01:01:38 GMT</pubDate></item></channel></rss>