<?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[int aus binärdatei]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich sitze im Moment an folgendem vereinfachtem Problem:<br />
Ich möchte aus einer 4 Byte großen Datei, einen int-Wert auslesen. Sagen wir es ist der Wert 0xf0a4bb71. In der Datei(&quot;binfile&quot;) steht damit als little-endian</p>
<pre><code>71 BB A4 F0
</code></pre>
<p>Um das auszulesen habe ich folgende Funktion:</p>
<pre><code>unsigned int readInt()
{
    fstream file;
    file.open(&quot;binfile&quot;, iostream::in|iostream::binary);

    unsigned char chrval[4];

    for(int i=0;i&lt;4;i++)
    {
        file&gt;&gt;chrval[i];
    }

    unsigned int value = (chrval[3]&lt;&lt;24)|(chrval[2]&lt;&lt;16)|(chrval[1]&lt;&lt;8)|chrval[0];

    return value;
}
</code></pre>
<p>Das Funktioniert auch ganz gut... mit der gegebenen Zahl. Wenn ich eine Zahl nehme, in der das höchste Byte zwischen 10 und 13 liegt, kommt ein falsches Ergebnis heraus. Bei 0xcbb71 in der &quot;binfile&quot;</p>
<pre><code>71 BB 0C 00
</code></pre>
<p>wird als Rückgabewert der Wert 0x7100bb71 gegeben.</p>
<p>Kann mir das jemand erklären?</p>
<p>Liebe Grüße<br />
Eike</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302138/int-aus-binärdatei</link><generator>RSS for Node</generator><lastBuildDate>Wed, 24 Jun 2026 13:00:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302138.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 11 Apr 2012 22:33:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to int aus binärdatei on Wed, 11 Apr 2012 22:33:25 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich sitze im Moment an folgendem vereinfachtem Problem:<br />
Ich möchte aus einer 4 Byte großen Datei, einen int-Wert auslesen. Sagen wir es ist der Wert 0xf0a4bb71. In der Datei(&quot;binfile&quot;) steht damit als little-endian</p>
<pre><code>71 BB A4 F0
</code></pre>
<p>Um das auszulesen habe ich folgende Funktion:</p>
<pre><code>unsigned int readInt()
{
    fstream file;
    file.open(&quot;binfile&quot;, iostream::in|iostream::binary);

    unsigned char chrval[4];

    for(int i=0;i&lt;4;i++)
    {
        file&gt;&gt;chrval[i];
    }

    unsigned int value = (chrval[3]&lt;&lt;24)|(chrval[2]&lt;&lt;16)|(chrval[1]&lt;&lt;8)|chrval[0];

    return value;
}
</code></pre>
<p>Das Funktioniert auch ganz gut... mit der gegebenen Zahl. Wenn ich eine Zahl nehme, in der das höchste Byte zwischen 10 und 13 liegt, kommt ein falsches Ergebnis heraus. Bei 0xcbb71 in der &quot;binfile&quot;</p>
<pre><code>71 BB 0C 00
</code></pre>
<p>wird als Rückgabewert der Wert 0x7100bb71 gegeben.</p>
<p>Kann mir das jemand erklären?</p>
<p>Liebe Grüße<br />
Eike</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200979</guid><dc:creator><![CDATA[eeucalyptus]]></dc:creator><pubDate>Wed, 11 Apr 2012 22:33:25 GMT</pubDate></item><item><title><![CDATA[Reply to int aus binärdatei on Wed, 11 Apr 2012 23:03:27 GMT]]></title><description><![CDATA[<p>Versuchs mal mit der <code>read</code> Methode des <code>fstream</code> statt mit <code>&gt;&gt;</code> . Letztere Funktion überspringt hier vermutlich Whitespace.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200983</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Wed, 11 Apr 2012 23:03:27 GMT</pubDate></item><item><title><![CDATA[Reply to int aus binärdatei on Wed, 11 Apr 2012 23:46:23 GMT]]></title><description><![CDATA[<p>Ich vermute Du arbeitest mit einem x86 und in der Datei steht Littel Endian, da gibts nichts umzuwandeln.</p>
<p>z.B.</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
using namespace std ;

unsigned int readInt()
{
    fstream file ;
    file.open(&quot;binfile&quot;, iostream::in|iostream::binary);
    unsigned int value ;
    file.read((char*)&amp;value, sizeof(int)) ;
    return value  ;
}
int main()
{
    ofstream file(&quot;binfile&quot;, iostream::out | iostream::binary) ;
    unsigned int wert = 0xcbb71 ; // 0xf0a4bb71 ;
    file.write((char*)&amp;wert, sizeof(int)) ;
    file.close() ;
    unsigned int test = readInt() ;
    return 0 ;
}
</code></pre>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2200987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2200987</guid><dc:creator><![CDATA[emmax]]></dc:creator><pubDate>Wed, 11 Apr 2012 23:46:23 GMT</pubDate></item><item><title><![CDATA[Reply to int aus binärdatei on Thu, 12 Apr 2012 19:08:27 GMT]]></title><description><![CDATA[<p>Hallo Eike,</p>
<p>Willkommen im C++-Forum.</p>
<p>Bei dem Problem, welches Du gerade hast, empfehle ich immer, einen eigenen ibinstream zu benutzen. Du bist nicht der erste, der binär aus einer Datei liest <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Die Anwendung sollte letzlich so aussehen:</p>
<pre><code class="language-cpp">#include &quot;ifbinstream.h&quot; // siehe nächstes Listing
#include &lt;iostream&gt;
#include &lt;cstdint&gt; // std::int32_t

int main()
{
    using namespace std;
    ifbinstream file( &quot;binfile&quot; );

    std::int32_t i; // stellt sicher, dass genau 4 Byte gelesen werden!
    if( file &gt;&gt; i )
    {
        cout &lt;&lt; &quot;int &quot; &lt;&lt; i &lt;&lt; &quot; gelesen&quot; &lt;&lt; endl;
    }
    return 0;
}
</code></pre>
<p>Damit ist das Look&amp;Feel genau wie beim std::ifstream, der auch nur ein <a href="http://www.cplusplus.com/reference/iostream/istream/" rel="nofollow">std::istream</a> ist. Letzterer ist für das Lesen von Formatierten Dateien gemacht, die 'vom Menschen lesbare' Zeichen enthalten. Daher ist die direkte Anwendung eines std::istreams hier nicht angesagt.</p>
<p>Das &quot;ifbinstream.h&quot; ist ein Wrapper für den ibinstream zusammen mit einem std::filebuf</p>
<pre><code class="language-cpp">// -- Datei ifbinstream.h
#ifndef IFBINSTREAM_H_INCLUDED_
#define IFBINSTREAM_H_INCLUDED_

#include &quot;ibinstream.h&quot; // z.Beispiel: http://www.c-plusplus.net/forum/p1561419#1561419
#include &lt;fstream&gt; // std::basic_filebuf

class ifbinstream : public ibinstream
{
public:
    explicit ifbinstream( const char* filename, std::ios_base::openmode mode = std::ios_base::in )
        : ibinstream( &amp;filebuf_ )
        , filebuf_()
    {
        if( !filebuf_.open( filename, mode | std::ios_base::in | std::ios_base::binary ) )
            setstate( std::ios_base::failbit );
    }
    bool is_open() const { return filebuf_.is_open(); }

private:
    std::basic_filebuf&lt; char &gt; filebuf_;
};
#endif
</code></pre>
<p>Eine Variante des <a href="http://www.c-plusplus.net/forum/p1561419#1561419" rel="nofollow">ibinstream</a> findest Du unter dem angegebenen Link. Falls Du vor einem Windows oder Linux OS sitzt, sollte der bereits so für Dich funktionieren.<br />
In Zeile 20 findest Du dort das eigentliche Lesen vom Streambuf (d.h in Deinem Fall aus der Datei).</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201290</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 12 Apr 2012 19:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to int aus binärdatei on Fri, 13 Apr 2012 10:07:42 GMT]]></title><description><![CDATA[<p>Oder man baut sich einfach einen eigenen Manipulator. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201530</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 13 Apr 2012 10:07:42 GMT</pubDate></item><item><title><![CDATA[Reply to int aus binärdatei on Fri, 13 Apr 2012 14:45:52 GMT]]></title><description><![CDATA[<p>Finde C++-Streams bei binäroperationen ziemlich unangenehm.</p>
<pre><code class="language-cpp">unsigned int readInt()
{
    std::unique_ptr&lt;FILE, decltype(&amp;std::fclose)&gt; file(std::fopen(&quot;binfile&quot;, &quot;rb&quot;), &amp;std::fclose);
    if(!file)
        return 0;

    unsigned int result;
    return std::fread(&amp;result, sizeof(result), 1, file) == sizeof(result) ? result : 0;
}
</code></pre>
<p>Oder am besten Generalisiert.</p>
<pre><code class="language-cpp">typedef std::unique_ptr&lt;FILE, decltype(&amp;std::fclose)&gt; File;

template&lt;typename T&gt;
T read(File&amp; file, typename std::enable_if&lt;std::is_pod&lt;T&gt;::value, void&gt;::type* = 0)
{
    T result;
    assert(std::fread(&amp;result, sizeof(result), 1, file) == sizeof(result));
    return result;
}

template&lt;typename T, class A = std::allocator&lt;T&gt;&gt;
std::vector&lt;T, A&gt; read(File&amp; file, std::size_t count, typename std::enable_if&lt;std::is_pod&lt;T&gt;::value, void&gt;::type* = 0)
{
    std::vector&lt;T, A&gt; result(count);
    assert(std::fread(result.data(), sizeof(T), count, file) == sizeof(T) * count);
    return result;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2201631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201631</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 13 Apr 2012 14:45:52 GMT</pubDate></item><item><title><![CDATA[Reply to int aus binärdatei on Fri, 13 Apr 2012 16:04:08 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">unsigned int readInt()
{
    std::unique_ptr&lt;FILE, decltype(&amp;std::fclose)&gt; file(std::fopen(&quot;binfile&quot;, &quot;rb&quot;), &amp;std::fclose);
    if(!file)
        return 0;

    unsigned int result;
    return std::fread(&amp;result, sizeof(result), 1, file) == sizeof(result) ? result : 0;
}
</code></pre>
</blockquote>
<p>Seit wann darf man <code>fclose</code> mit Null aufrufen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201698</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Fri, 13 Apr 2012 16:04:08 GMT</pubDate></item><item><title><![CDATA[Reply to int aus binärdatei on Fri, 13 Apr 2012 16:34:59 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">unsigned int readInt()
{
    std::unique_ptr&lt;FILE, decltype(&amp;std::fclose)&gt; file(std::fopen(&quot;binfile&quot;, &quot;rb&quot;), &amp;std::fclose);
    if(!file)
        return 0;

    unsigned int result;
    return std::fread(&amp;result, sizeof(result), 1, file) == sizeof(result) ? result : 0;
}
</code></pre>
</blockquote>
<p>Seit wann darf man <code>fclose</code> mit Null aufrufen?</p>
</blockquote>
<p>Gute Qualität und frische Zutaten <strong>seit 1972</strong>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201711</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 13 Apr 2012 16:34:59 GMT</pubDate></item><item><title><![CDATA[Reply to int aus binärdatei on Fri, 13 Apr 2012 16:42:21 GMT]]></title><description><![CDATA[<p>Upps, darf man wirklich nicht. Komme etwas durcheinander, da ich mir für soetwas selbst etwas geschrieben habe, da mich immer schon das fehlende Copy bei der FILE/den Streams gestört hat, benutze die C-File API selten. Trotzdem angenehmer imho als mit den fetten Streams rumzuarbeiten, die dafür überhaupt nicht gedacht sind.</p>
<p>Das Problem mit fclose wäre leicht zu lösen, würde aber immer hackier werden. Dadurch noch hässlicher als mit std::istream, also egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201713</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 13 Apr 2012 16:42:21 GMT</pubDate></item></channel></rss>