<?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[Frage zu Zeiger]]></title><description><![CDATA[<p>Hi!</p>
<p>Wir nehmen gerade in der Schule Zeiger in C++ durch und unser Lehrer hat uns folgende Aufgabe gestellt:</p>
<p>Es soll ein Datenpacket gebaut werden (ohne klassen oder so, das haben wir noch nicht.) das aus einem Array von chars besteht, genannt &quot;byte_t&quot;. Dieses Array ist in 3 Bereiche aufgeteilt:</p>
<p>1x Kennung der Daten (3 Byte für &quot;str&quot;, &quot;int&quot; oder &quot;flt&quot; usw.)<br />
1x Länge der Daten (4 byte size_t)<br />
1x Die daten selbst (n byte)</p>
<p>Soweit sogut, die Kennung setzen und die Daten reinkopieren und auslesen ist kein Problem, aber wie bekomme ich einen size_t in ein char-Array an die Position 3 bis 7?</p>
<p>Hier der Code an dem ich gerade arbeite:</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

// Aufbau eines Datenpackets:
//
// ---------------------------------------------------------------------------
// |  3 Byte   |  4 Byte           |  n Byte      .......................... |
// |  Kennung  |  Länge der Daten  |  Die Daten   .......................... |
// ---------------------------------------------------------------------------
typedef unsigned char byte_t;

byte_t* erstelle_daten (char* inhalt)
{
    size_t laenge = 0;
    laenge += 3; // Kennung der Daten
    laenge += 4; // Länge der daten als size_t
    laenge += strlen (inhalt);

    // ergebnis erstellen.
    byte_t* ergebnis = new byte_t[laenge];
    memset (ergebnis, 0, laenge);

    // Kennung setzen
    ergebnis[0] = 's'; ergebnis[1] = 't'; ergebnis[2] = 'r';

    // ###################################################
    // TODO:
    // Länge setzen.
    // ###################################################

    // daten einfügen (ohne \0!)
    size_t daten_anfang = laenge - strlen (inhalt);
    memcpy (ergebnis + daten_anfang, inhalt, strlen (inhalt));

    return ergebnis;
}

void zeige_daten (byte_t* daten)
{
    // ist es ein string?
    if (daten[0] == 's' &amp;&amp; daten[1] == 't' &amp;&amp; daten[2] == 'r')
    {
        // zur länge der daten gehen:
        daten += 3; 

        // Länge der daten auslesen.
        size_t laenge = 0;
        // ###################################################
        // TODO: wie machen?
        // ###################################################

        // zu den daten gehen.
        daten += 4;

        // - puffer für die ausgabe erstellen. (+1 wegen \0!)
        // - string aus dem datenpacket holen und terminieren.
        // - ausgeben und puffer freigeben.
        char* puffer = new char[laenge + 1];
        memcpy (puffer, daten, laenge);
        puffer[laenge] = '\0';

        printf (&quot;inhalt des puffers: %s\n&quot;, puffer);
        delete [] puffer;
    }
}

int main ()
{
    byte_t* daten = erstelle_daten (&quot;hallo welt!&quot;);
    zeige_daten (daten);
    delete [] daten;
}
</code></pre>
<p>Muss ich den size_t in 4 Bytes aufteilen und dann setzen? Wie mache ich das am Besten?</p>
<p>Viele Grüße, euer C++ Zeiger-Neuling.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243398/frage-zu-zeiger</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 03:27:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243398.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Jun 2009 10:45:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Zeiger on Tue, 16 Jun 2009 10:45:17 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Wir nehmen gerade in der Schule Zeiger in C++ durch und unser Lehrer hat uns folgende Aufgabe gestellt:</p>
<p>Es soll ein Datenpacket gebaut werden (ohne klassen oder so, das haben wir noch nicht.) das aus einem Array von chars besteht, genannt &quot;byte_t&quot;. Dieses Array ist in 3 Bereiche aufgeteilt:</p>
<p>1x Kennung der Daten (3 Byte für &quot;str&quot;, &quot;int&quot; oder &quot;flt&quot; usw.)<br />
1x Länge der Daten (4 byte size_t)<br />
1x Die daten selbst (n byte)</p>
<p>Soweit sogut, die Kennung setzen und die Daten reinkopieren und auslesen ist kein Problem, aber wie bekomme ich einen size_t in ein char-Array an die Position 3 bis 7?</p>
<p>Hier der Code an dem ich gerade arbeite:</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

// Aufbau eines Datenpackets:
//
// ---------------------------------------------------------------------------
// |  3 Byte   |  4 Byte           |  n Byte      .......................... |
// |  Kennung  |  Länge der Daten  |  Die Daten   .......................... |
// ---------------------------------------------------------------------------
typedef unsigned char byte_t;

byte_t* erstelle_daten (char* inhalt)
{
    size_t laenge = 0;
    laenge += 3; // Kennung der Daten
    laenge += 4; // Länge der daten als size_t
    laenge += strlen (inhalt);

    // ergebnis erstellen.
    byte_t* ergebnis = new byte_t[laenge];
    memset (ergebnis, 0, laenge);

    // Kennung setzen
    ergebnis[0] = 's'; ergebnis[1] = 't'; ergebnis[2] = 'r';

    // ###################################################
    // TODO:
    // Länge setzen.
    // ###################################################

    // daten einfügen (ohne \0!)
    size_t daten_anfang = laenge - strlen (inhalt);
    memcpy (ergebnis + daten_anfang, inhalt, strlen (inhalt));

    return ergebnis;
}

void zeige_daten (byte_t* daten)
{
    // ist es ein string?
    if (daten[0] == 's' &amp;&amp; daten[1] == 't' &amp;&amp; daten[2] == 'r')
    {
        // zur länge der daten gehen:
        daten += 3; 

        // Länge der daten auslesen.
        size_t laenge = 0;
        // ###################################################
        // TODO: wie machen?
        // ###################################################

        // zu den daten gehen.
        daten += 4;

        // - puffer für die ausgabe erstellen. (+1 wegen \0!)
        // - string aus dem datenpacket holen und terminieren.
        // - ausgeben und puffer freigeben.
        char* puffer = new char[laenge + 1];
        memcpy (puffer, daten, laenge);
        puffer[laenge] = '\0';

        printf (&quot;inhalt des puffers: %s\n&quot;, puffer);
        delete [] puffer;
    }
}

int main ()
{
    byte_t* daten = erstelle_daten (&quot;hallo welt!&quot;);
    zeige_daten (daten);
    delete [] daten;
}
</code></pre>
<p>Muss ich den size_t in 4 Bytes aufteilen und dann setzen? Wie mache ich das am Besten?</p>
<p>Viele Grüße, euer C++ Zeiger-Neuling.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727487</guid><dc:creator><![CDATA[C++ Zeiger-Neuling]]></dc:creator><pubDate>Tue, 16 Jun 2009 10:45:17 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Zeiger on Tue, 16 Jun 2009 10:52:22 GMT]]></title><description><![CDATA[<p>Du könntest es auch mit memcpy machen. Ist dann aber nicht mehr plattformunabhängig. Da dein Lehrer aber anscheinen davon ausgeht, dass size_t immer 4 byte groß ist (was auf 64 Bit Systemen nicht stimmt), ist plattformunabhängig wahrscheinlich egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727491</guid><dc:creator><![CDATA[deractionhit]]></dc:creator><pubDate>Tue, 16 Jun 2009 10:52:22 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Zeiger on Tue, 16 Jun 2009 12:28:34 GMT]]></title><description><![CDATA[<p>C++ Zeiger-Neuling schrieb:</p>
<blockquote>
<p>Soweit sogut, [...] aber wie bekomme ich einen size_t in ein char-Array an die Position 3 bis 7?</p>
</blockquote>
<p>Du hast also das:</p>
<pre><code class="language-cpp">std::size_t Value = 123456789;
char Array[8] = {};
</code></pre>
<p>Dann kannst du zum Beispiel casten:</p>
<pre><code class="language-cpp">*reinterpret_cast&lt;std::size_t*&gt;(Array + 3) = Value;
</code></pre>
<p>Oder byteweise kopieren:</p>
<pre><code class="language-cpp">memcpy(Array + 3, &amp;Value, sizeof(Value));
</code></pre>
<p>Man könnte das im Weiteren auch über <code>union</code> lösen, das wäre allerdings etwas umständlich. Gibt es eigentlich einen Grund, wieso ihr keine <code>struct</code> s nehmt? Du kannst das Padding bei den meisten Compilern auch auf 1 Byte minimieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727570</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 16 Jun 2009 12:28:34 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Zeiger on Tue, 16 Jun 2009 14:51:48 GMT]]></title><description><![CDATA[<p>hi!</p>
<p>dank dir, für die ausführliche Hilfe Nexus! Auch dir deractionhit!</p>
<p>Ich habe es nun mit dem memcpy gemacht, das halte ich für die beste Lösung zum setzen der Daten. <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="🙂"
    /> Zum auslesen der Daten habe ich dies hier gemacht:</p>
<pre><code class="language-cpp">size_t laenge = *reinterpret_cast&lt;size_t*&gt;(daten + 3);
</code></pre>
<p>läuft echt super! Danke euch beiden noch mal. <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/1727691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727691</guid><dc:creator><![CDATA[C++ Zeiger-Neuling]]></dc:creator><pubDate>Tue, 16 Jun 2009 14:51:48 GMT</pubDate></item></channel></rss>