<?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[Problem mit speichern von Binärdatei und vermutlich Nullbyteterminierung]]></title><description><![CDATA[<p>Hallo,</p>
<p>zurzeit versuche ich mit Sockets ein Binary File (ein Bild) herunterzuladen. Das funktioniert, jedoch wird es nicht richtig abgespeichert..</p>
<p>Zuerst der Code:</p>
<pre><code>#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netdb.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;iostream&gt;
#include &lt;string.h&gt;
#include &lt;fstream&gt;
using namespace std;

int main(void)
{
int s = socket(AF_INET, SOCK_STREAM, 0);
struct hostent *host = gethostbyname(&quot;www.google.de&quot;);
struct sockaddr_in addr;

addr.sin_addr = *(struct in_addr *)host-&gt;h_addr;
addr.sin_port = htons(80);
addr.sin_family = AF_INET;

connect(s, (sockaddr *)&amp;addr, sizeof(addr));
string rrr = &quot;GET /intl/de_de/images/logo.gif HTTP/1.1\r\nHost: www.google.de\r\nConnection: close\r\n\r\n&quot;;
send(s, rrr.c_str(), rrr.size(), 0);

char recieved[1024];
memset(recieved, 0, sizeof(recieved));fstream f1(&quot;logo.gif&quot;, ios::out | ios::binary);
while(recv(s, recieved, sizeof(recieved )-1, 0))
{
f1 &lt;&lt; recieved;

memset(recieved, 0, sizeof(recieved));
}

f1.close();
}
</code></pre>
<p>Ja, die HTTP-Response headers werden mit in die Datei geschrieben, aber das ist ein Problem, welches nicht besprochen werden muss da die Lösung mir geläufig ist <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="😉"
    /><br />
Das Problem ist scheinbar die Nullbyte-Terminierung. Öffne ich das &quot;richtig heruntergeladene&quot; Logo der Suchmaschine mit einem Hexeditor, so erhalte ich:</p>
<p>47 49 46 38 39 61 2d 01 6e <strong>00</strong> e7</p>
<p>Die Version meines Programms:</p>
<p>47 49 46 38 39 61 2d 01 6e <strong>82 5a 69 0e</strong>...</p>
<p>Hier ist das Nullbyte laut meiner Vermutung das Problem.Ich glaube, ich sollte Memory-Funktionen verwenden,<br />
statt String-Funktionen um diese entsprechen zu behandeln. Weiss jemand genau, wie man das Bild richtig abspeichert?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/248676/problem-mit-speichern-von-binärdatei-und-vermutlich-nullbyteterminierung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 21:07:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/248676.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 27 Aug 2009 18:02:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit speichern von Binärdatei und vermutlich Nullbyteterminierung on Thu, 27 Aug 2009 18:02:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>zurzeit versuche ich mit Sockets ein Binary File (ein Bild) herunterzuladen. Das funktioniert, jedoch wird es nicht richtig abgespeichert..</p>
<p>Zuerst der Code:</p>
<pre><code>#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netdb.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;iostream&gt;
#include &lt;string.h&gt;
#include &lt;fstream&gt;
using namespace std;

int main(void)
{
int s = socket(AF_INET, SOCK_STREAM, 0);
struct hostent *host = gethostbyname(&quot;www.google.de&quot;);
struct sockaddr_in addr;

addr.sin_addr = *(struct in_addr *)host-&gt;h_addr;
addr.sin_port = htons(80);
addr.sin_family = AF_INET;

connect(s, (sockaddr *)&amp;addr, sizeof(addr));
string rrr = &quot;GET /intl/de_de/images/logo.gif HTTP/1.1\r\nHost: www.google.de\r\nConnection: close\r\n\r\n&quot;;
send(s, rrr.c_str(), rrr.size(), 0);

char recieved[1024];
memset(recieved, 0, sizeof(recieved));fstream f1(&quot;logo.gif&quot;, ios::out | ios::binary);
while(recv(s, recieved, sizeof(recieved )-1, 0))
{
f1 &lt;&lt; recieved;

memset(recieved, 0, sizeof(recieved));
}

f1.close();
}
</code></pre>
<p>Ja, die HTTP-Response headers werden mit in die Datei geschrieben, aber das ist ein Problem, welches nicht besprochen werden muss da die Lösung mir geläufig ist <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="😉"
    /><br />
Das Problem ist scheinbar die Nullbyte-Terminierung. Öffne ich das &quot;richtig heruntergeladene&quot; Logo der Suchmaschine mit einem Hexeditor, so erhalte ich:</p>
<p>47 49 46 38 39 61 2d 01 6e <strong>00</strong> e7</p>
<p>Die Version meines Programms:</p>
<p>47 49 46 38 39 61 2d 01 6e <strong>82 5a 69 0e</strong>...</p>
<p>Hier ist das Nullbyte laut meiner Vermutung das Problem.Ich glaube, ich sollte Memory-Funktionen verwenden,<br />
statt String-Funktionen um diese entsprechen zu behandeln. Weiss jemand genau, wie man das Bild richtig abspeichert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1767857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1767857</guid><dc:creator><![CDATA[YetAnotherProblem-haber]]></dc:creator><pubDate>Thu, 27 Aug 2009 18:02:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit speichern von Binärdatei und vermutlich Nullbyteterminierung on Thu, 27 Aug 2009 18:57:47 GMT]]></title><description><![CDATA[<p>Warum benutzt du dann cstrings, wenn die Nullterminierung Probleme macht? Offensichtlich ist dir std::string ja bekannt, auch wenn ich mich ein wenig wundere, dass dein Programm überhaupt kompiliert. string.h sollte nämlich eigentlich die C Stringfunktionen enthalten (also das was in C++ in cstring steht) und nicht std::string.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1767884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1767884</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 27 Aug 2009 18:57:47 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit speichern von Binärdatei und vermutlich Nullbyteterminierung on Thu, 27 Aug 2009 19:05:35 GMT]]></title><description><![CDATA[<p>Nunja, versuch mal recv auf std::string zu machen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1767886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1767886</guid><dc:creator><![CDATA[YetAnotherProblem-haber]]></dc:creator><pubDate>Thu, 27 Aug 2009 19:05:35 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit speichern von Binärdatei und vermutlich Nullbyteterminierung on Thu, 27 Aug 2009 19:37:10 GMT]]></title><description><![CDATA[<p>Ok, recv kannte ich jetzt nicht, da Windowskram.</p>
<p>Dann ist eine einfache Lösung, die Ausgabe byteweise zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1767902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1767902</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 27 Aug 2009 19:37:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit speichern von Binärdatei und vermutlich Nullbyteterminierung on Thu, 27 Aug 2009 19:49:23 GMT]]></title><description><![CDATA[<p>Ich habe das Gefühl, du weisst nicht, von was du sprichst. recv ist keineswegs Windows-Kram.</p>
<p>#include &lt;sys/types.h&gt;<br />
#include &lt;sys/socket.h&gt;</p>
<p>Und ich glaube, Windows Compiler würden unter anderem diese Headerdateien nicht finden ;).</p>
<blockquote>
<p>Dann ist eine einfache Lösung, die Ausgabe byteweise zu machen.</p>
</blockquote>
<p>und wie? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1767913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1767913</guid><dc:creator><![CDATA[YetAnotherProblem-haber]]></dc:creator><pubDate>Thu, 27 Aug 2009 19:49:23 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit speichern von Binärdatei und vermutlich Nullbyteterminierung on Thu, 27 Aug 2009 20:30:12 GMT]]></title><description><![CDATA[<p>YetAnotherProblem-haber schrieb:</p>
<blockquote>
<p>Ich habe das Gefühl, du weisst nicht, von was du sprichst. recv ist keineswegs Windows-Kram.</p>
</blockquote>
<p>War der Top Treffer bei ggogle für recv. Aber ist für das Problem ja auch völlig egal.</p>
<blockquote>
<p>und wie? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<pre><code class="language-cpp">for (int i=0; i&lt;1024;++i) f1.put(recieved[i]);
</code></pre>
<p>edit: Oder auch mit write(), ist wahrscheinlich sogar besser.</p>
<p>edit2: Ja, ist besser:</p>
<pre><code class="language-cpp">f1.write(recieved,1024);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1767926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1767926</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 27 Aug 2009 20:30:12 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit speichern von Binärdatei und vermutlich Nullbyteterminierung on Thu, 27 Aug 2009 21:03:36 GMT]]></title><description><![CDATA[<p>Es sollte aber nur soviel geschrieben werden, wie auch mit recv() empfangen wird, d.h. den Rückgabewert beachten!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1767936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1767936</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Thu, 27 Aug 2009 21:03:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit speichern von Binärdatei und vermutlich Nullbyteterminierung on Fri, 28 Aug 2009 05:20:10 GMT]]></title><description><![CDATA[<p>Genau, Rückgabewert von recv nicht beachtet, klassischer Fehler.</p>
<p>Nur mal als Denkanstoß: Du gehst wohl nicht davon aus, dass jedes Bild bei Google exakt 1024 Bytes lang ist. Dir ist zudem bereits bewusst, dass Nullbytes C-Strings terminieren. Eine Länge speicherst Du auch nirgends.<br />
Ja, wie soll denn der operator&lt;&lt; nun überhaupt feststellen können, wie lang die Daten sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768008</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 28 Aug 2009 05:20:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit speichern von Binärdatei und vermutlich Nullbyteterminierung on Fri, 28 Aug 2009 10:11:41 GMT]]></title><description><![CDATA[<p>Danke, ich werde mich dann mal damit beschäftigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768146</guid><dc:creator><![CDATA[YetAnotherProblem-haber]]></dc:creator><pubDate>Fri, 28 Aug 2009 10:11:41 GMT</pubDate></item></channel></rss>