<?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[Daten mit Terminating Zero formatieren]]></title><description><![CDATA[<p>Hey,</p>
<p>ich muss binäre Daten versenden, da die Befehle als Binärdaten codiert sind.</p>
<p>Das wäre alles kein Problem, aber der Aufbau des Buffers macht mir Probleme. Ich hatte anfangs versucht mit std::stringstream alles zusammen zu bauen, jedoch hat std::stringstream meine \0 rausgekillt, was die Befehle zerstört hat.</p>
<p>Auch mit sprintf konnte ich das Problem nicht lösen.</p>
<p>Wie kann ich das am besten umsetzen? Ich bräuchte im Prinzip sowas:</p>
<pre><code class="language-cpp">char buf[1024];

addToBuf(buf, &quot;\10\0\0\0\1\3&quot;);
addToBuf(buf, std::string(&quot;HELLO&quot;).c_str());
addToBuf(buf, &quot;\10\10\0&quot;);
</code></pre>
<p>Ideen für eine möglichst schöne Lösung? <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/topic/275579/daten-mit-terminating-zero-formatieren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 17:58:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/275579.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 17 Oct 2010 14:48:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Daten mit Terminating Zero formatieren on Sun, 17 Oct 2010 14:48:50 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>ich muss binäre Daten versenden, da die Befehle als Binärdaten codiert sind.</p>
<p>Das wäre alles kein Problem, aber der Aufbau des Buffers macht mir Probleme. Ich hatte anfangs versucht mit std::stringstream alles zusammen zu bauen, jedoch hat std::stringstream meine \0 rausgekillt, was die Befehle zerstört hat.</p>
<p>Auch mit sprintf konnte ich das Problem nicht lösen.</p>
<p>Wie kann ich das am besten umsetzen? Ich bräuchte im Prinzip sowas:</p>
<pre><code class="language-cpp">char buf[1024];

addToBuf(buf, &quot;\10\0\0\0\1\3&quot;);
addToBuf(buf, std::string(&quot;HELLO&quot;).c_str());
addToBuf(buf, &quot;\10\10\0&quot;);
</code></pre>
<p>Ideen für eine möglichst schöne Lösung? <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/1966736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966736</guid><dc:creator><![CDATA[....]]></dc:creator><pubDate>Sun, 17 Oct 2010 14:48:50 GMT</pubDate></item><item><title><![CDATA[Reply to Daten mit Terminating Zero formatieren on Sun, 17 Oct 2010 14:53:56 GMT]]></title><description><![CDATA[<p>Ich brauche mehr Details. Dein Beispiel rechtfertigt stringstream gar nicht.<br />
&lt;&lt;'\0'<br />
müßte gehen. Oder in einem std::string sammeln. Oder write nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966741</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 17 Oct 2010 14:53:56 GMT</pubDate></item><item><title><![CDATA[Reply to Daten mit Terminating Zero formatieren on Sun, 17 Oct 2010 15:03:58 GMT]]></title><description><![CDATA[<p>Du darfst halt keine C-Strings benutzen. Also alles wo implizit die Größe von einem Literal bestimmt wird. Da kann dein addToBuf von der API her schon gar nicht funktionieren.</p>
<pre><code class="language-cpp">char str[] = &quot;\10\10\0\1\3&quot;;
std::string s(str, str + sizeof(str)-1);
</code></pre>
<p>oder eben</p>
<pre><code class="language-cpp">std::stringstream sstr &lt;&lt; &quot;\10\10&quot; &lt;&lt; '\0' &lt;&lt; &quot;\1\3&quot;;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1966746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966746</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Sun, 17 Oct 2010 15:03:58 GMT</pubDate></item><item><title><![CDATA[Reply to Daten mit Terminating Zero formatieren on Sun, 17 Oct 2010 15:40:49 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::stringstream strm;
strm &lt;&lt; &quot;Blub\0\0\0\0\0\13&quot; &lt;&lt; 1001 &lt;&lt; &quot;bla&quot;;

sock.write(strm.str().c_str(), strm.str().size());
</code></pre>
<p>Versende ich dies nun, dann kommt auf der Gegenseite folgendes an:</p>
<blockquote>
<p>42 6c 75 62 31 30 30 31 62 6c 61 Blub1001 bla</p>
</blockquote>
<p>Die 0 ist nicht mehr zu sehen und anscheinend verloren gegangen.<br />
Sie gehört aber dazu und das ist das Problem, was es zu lösen gilt. Deswegen frage ich hier um Hilfe.</p>
<p>Ich nutze std::stringstream, da neben den Binären Befehlen auch &quot;normale&quot; Zahlen und Strings vorkommen können, die so bequem umgewandelt werden.</p>
<p>Compiler ist MS Visual Studio 2010.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966759</guid><dc:creator><![CDATA[....]]></dc:creator><pubDate>Sun, 17 Oct 2010 15:40:49 GMT</pubDate></item><item><title><![CDATA[Reply to Daten mit Terminating Zero formatieren on Sun, 17 Oct 2010 16:14:14 GMT]]></title><description><![CDATA[<p>.... schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::stringstream strm;
strm &lt;&lt; &quot;Blub\0\0\0\0\0\13&quot;
</code></pre>
</blockquote>
<p>Hier lädst Du nur<br />
strm &lt;&lt; &quot;Blub&quot;<br />
denn am ersten '\0' hört für den op&lt;&lt; dein Eingabestring auf.</p>
<pre><code class="language-cpp">strm &lt;&lt; &quot;Blub&quot; &lt;&lt;'\0'&lt;&lt;'\0'&lt;&lt;'\0'&lt;&lt;'\0'&lt;&lt;'\0'&lt;&lt;'\13'
</code></pre>
<p>Oder die addToBuf so machen, daß sie Stringliterale ihrer sizeof nach schreibt und nicht bis zum '\0'.</p>
<pre><code class="language-cpp">template&lt;size_t size&gt;
void addToBuf(char*&amp; buf,char const (&amp;str)[size]){
   memcpy(buf,str,size-1);
   buf+=size-1;
}
void addToBuf(char*&amp; buf,char const *str){
   size_t len=strlen(str);
   strcpy(buf,str,len);
   buf+=len;
}
</code></pre>
<pre><code class="language-cpp">char buf[1024];
char* end=buf;
addToBuf(end, &quot;\10\0\0\0\1\3&quot;);
addToBuf(end, std::string(&quot;HELLO&quot;).c_str());
addToBuf(end, &quot;\10\10\0&quot;);
socket.write(buf,end-buf);
</code></pre>
<p>eklig. Lieber in einem std::string oder vector&lt;char&gt; oder stringstream sammeln.</p>
<pre><code class="language-cpp">template&lt;size_t size&gt;
void addToBuf(stringstream&amp; out,char const (&amp;str)[size]){
   out.write(str,size-1);//oder so. lange nicht mehr write benutzt
}
</code></pre>
<p>Oder noch cooler:</p>
<pre><code class="language-cpp">struct StringLiteral{
   char const* start;
   char const* end;
   template&lt;size_t size&gt; 
   StringLiteral(char const (&amp;str)[size]){
      start=str;
      this-&gt;size=size;
   }
   friend ostream&amp; operator&lt;&lt;(ostream&amp; out,StringLiteral const&amp; sl){
      out.write(sl.start,sl.size-1);
   }
}
</code></pre>
<pre><code class="language-cpp">ostringstream oss;
oss&lt;&lt;StringLiteral(&quot;\10\0\0\0\1\3&quot;);
oss&lt;&lt;std::string(&quot;HELLO&quot;).c_str());
oss&lt;&lt;StringLiteral(&quot;\10\10\0&quot;);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1966768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966768</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 17 Oct 2010 16:14:14 GMT</pubDate></item></channel></rss>