<?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[Structs über Templates bearbeiten]]></title><description><![CDATA[<p>Hi,</p>
<p>die Ausgangssituation ist immer die, dass ich ein <em>unsigned char</em>* bekomme und daraus die Daten für die Structs lesen muss. Die Länge ist zusätzlich bekannt.</p>
<p>Leider kann ich das nicht so machen:</p>
<pre><code class="language-cpp">unsigned char *pcData; //die Daten
TMyStruct *pMyStruct = (TMyStruct*) pcData; //ich weiss, wird nicht gern gesehen
</code></pre>
<p>da das Ganze in <em>big-endian</em> vorliegt.</p>
<p>Für das Auslesen der einzelnen Werte des Structs hab ich mir schon ein Template geschrieben.</p>
<p>Doch wie kann ich das jetzt für verschiedenste Structs (die Member variieren von <em>unsigned short, unsigned int, unsigned char, unsigned char[]</em>) machen? Irgendwie bin ich fast der Meinung, dass das nicht möglich ist.<br />
Hat jmd schon mal so was umgesetzt?</p>
<p>Maffe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/134328/structs-über-templates-bearbeiten</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 22:18:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/134328.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Jan 2006 12:42:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Structs über Templates bearbeiten on Wed, 25 Jan 2006 12:42:41 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>die Ausgangssituation ist immer die, dass ich ein <em>unsigned char</em>* bekomme und daraus die Daten für die Structs lesen muss. Die Länge ist zusätzlich bekannt.</p>
<p>Leider kann ich das nicht so machen:</p>
<pre><code class="language-cpp">unsigned char *pcData; //die Daten
TMyStruct *pMyStruct = (TMyStruct*) pcData; //ich weiss, wird nicht gern gesehen
</code></pre>
<p>da das Ganze in <em>big-endian</em> vorliegt.</p>
<p>Für das Auslesen der einzelnen Werte des Structs hab ich mir schon ein Template geschrieben.</p>
<p>Doch wie kann ich das jetzt für verschiedenste Structs (die Member variieren von <em>unsigned short, unsigned int, unsigned char, unsigned char[]</em>) machen? Irgendwie bin ich fast der Meinung, dass das nicht möglich ist.<br />
Hat jmd schon mal so was umgesetzt?</p>
<p>Maffe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/975819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/975819</guid><dc:creator><![CDATA[Maffe001]]></dc:creator><pubDate>Wed, 25 Jan 2006 12:42:41 GMT</pubDate></item><item><title><![CDATA[Reply to Structs über Templates bearbeiten on Wed, 25 Jan 2006 12:50:52 GMT]]></title><description><![CDATA[<p>Was soll das bitteschön werden? Aus deiner Beschreibung werde ich nicht ganz schlau.</p>
<p>(am besten verpasst du jedem deiner Strukturtypen einen char*-Konstruktor, der den übergebenen String dann geeignet auseinandernimmt)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/975839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/975839</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Wed, 25 Jan 2006 12:50:52 GMT</pubDate></item><item><title><![CDATA[Reply to Structs über Templates bearbeiten on Wed, 25 Jan 2006 13:03:59 GMT]]></title><description><![CDATA[<p>Hmm,</p>
<p>hab ich mich so undeutlich ausgedrückt?</p>
<p>Bsp:</p>
<pre><code class="language-cpp">TMyStruct1
{
    unsigned char Val1;
    unsigned short Val2;
    unsigned char Text1[10];
    unsigned int Val3;
};

TMyStruct2
{
    unsigned short Val1;
    unsigned short Val2;
    unsigned int Val3;
};
</code></pre>
<p>Wie sollte das Template aussehen, um jetzt die Daten aus dem <em>unsigned char</em>* auszulesen? Die Identifikation, welche Daten enthalten sind, bekomme ich aus dem Header im Array. Also kann ich das Template auch explizit benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/975872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/975872</guid><dc:creator><![CDATA[Maffe001]]></dc:creator><pubDate>Wed, 25 Jan 2006 13:03:59 GMT</pubDate></item><item><title><![CDATA[Reply to Structs über Templates bearbeiten on Wed, 25 Jan 2006 13:28:30 GMT]]></title><description><![CDATA[<p>Vielleicht ist meine Idee mit dem Templates auch nicht die Beste? Fällt euch denn eine andere Möglichkeit ein, wie man mein Problem lösen kann, ohne dass ich für jedes Struct eine eigene Funktion schreiben muss?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/975919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/975919</guid><dc:creator><![CDATA[Maffe001]]></dc:creator><pubDate>Wed, 25 Jan 2006 13:28:30 GMT</pubDate></item><item><title><![CDATA[Reply to Structs über Templates bearbeiten on Wed, 25 Jan 2006 14:56:40 GMT]]></title><description><![CDATA[<p>Bei Templates mußt du zur Compilezeit wissen, mit welchem Typ du die instantiieren mußt - von daher fallen sie für Laufzeit-Überprüfungen aus.</p>
<p>(interessant wäre es ja zu wissen, nach welchen Kriterien du zwischen TMyStruct1 und TMyStrunct2 auswählst)</p>
<p>PS: Eventuell wäre ein &quot;virtueller Konstruktor&quot; etwas für dich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/976038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/976038</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 25 Jan 2006 14:56:40 GMT</pubDate></item><item><title><![CDATA[Reply to Structs über Templates bearbeiten on Tue, 31 Jan 2006 11:15:26 GMT]]></title><description><![CDATA[<p><strong><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>:</strong></p>
<p>Ich hab deine erste Idee aufgegriffen. Jedes Struct bietet jetzt die gleichen Funktionen an, so dass die Bearbeitung über ein Template kein Problem mehr ist.</p>
<p>Danke nochmal. <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>
<p>[EDIT]Rechtschreibfehler :D[/EDIT]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981864</guid><dc:creator><![CDATA[Maffe001]]></dc:creator><pubDate>Tue, 31 Jan 2006 11:15:26 GMT</pubDate></item><item><title><![CDATA[Reply to Structs über Templates bearbeiten on Tue, 31 Jan 2006 22:56:29 GMT]]></title><description><![CDATA[<p>Maffe001 schrieb:</p>
<blockquote>
<p>die Ausgangssituation ist immer die, dass ich ein <em>unsigned char</em>* bekomme und daraus die Daten für die Structs lesen muss. Die Länge ist zusätzlich bekannt.</p>
<p>Leider kann ich das nicht so machen:</p>
<pre><code class="language-cpp">unsigned char *pcData; //die Daten
TMyStruct *pMyStruct = (TMyStruct*) pcData; //ich weiss, wird nicht gern gesehen
</code></pre>
<p>da das Ganze in <em>big-endian</em> vorliegt.</p>
<p>Für das Auslesen der einzelnen Werte des Structs hab ich mir schon ein Template geschrieben.</p>
<p>Doch wie kann ich das jetzt für verschiedenste Structs (die Member variieren von <em>unsigned short, unsigned int, unsigned char, unsigned char[]</em>) machen? Irgendwie bin ich fast der Meinung, dass das nicht möglich ist.<br />
Hat jmd schon mal so was umgesetzt?</p>
</blockquote>
<p>Ja, sogar schon öfter. Die Lösung ist immer ein binärer Stream. Du baust Dir eine eigene Stream-Klasse, die von std::basic_ios&lt; char &gt; abgeleitet ist, und implementierst für die einzelnen rudimentären Typen (char, int, long, usw ) die operator&gt;&gt;( Type&amp; x )-Methoden. In eben diesen Methoden kannst Du dann alle Big- und little-Endian-Probleme erledigen.<br />
Danach brauchst Du noch einen streambuf, auf dem der Stream arbeiten kann. Ein Memory-Streambuf zu machen ist sehr einfach - z.B.:</p>
<pre><code class="language-cpp">#include &lt;streambuf&gt;

class MemoryBuf : public std::streambuf
{
public:
    typedef std::streambuf base_type;

    MemoryBuf( char* first, char* last )
        : base_type()
    {
        setg( first, first, last );
    }
};
</code></pre>
<p>den legst Du an, übergibst Anfang und Ende Deines char-Arrays, und anschließend legst Du Deinen Stream an und übergibst einen Pointer auf eben diesen MemoryBuf. Besser wäre es noch, Du baust (oder hast) einen Streambuf für Deine Original-Zeichen-Strom-Quelle (z.B. File,Socket, etc. )</p>
<p>Dann muss man leider für jede struct einen operator&gt;&gt; schreiben</p>
<pre><code class="language-cpp">DeinStream&amp; operator&gt;&gt;( DeinStream&amp; in, EineStruct&amp; s );
</code></pre>
<p>in der dann die einzelnen Member der Struct eingelesen werden. Wenn Du das für zu viel Arbeit und für zu kompliziert hälst, dann lass Dir sagen: es gibt in C++ keine einfachere Lösung, die Dir ein solches Maß an Problem-Behandlung und Flexibilität liefert. Im übrigen ist das auch noch ziemlich Standard-like <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/982628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/982628</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 31 Jan 2006 22:56:29 GMT</pubDate></item></channel></rss>