<?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[Designfrage: Datentypübertragung über das Netzwerk]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich bekomme Daten über ein definiertes internes Protokoll. Auf das Protokoll habe ich keinen Einfluss, d.h. ich kann nicht die Art der Datenübertragung ändern. Im Prinzip werden mir viele Tupel gesendet, wobei alle Tupel dieselben Eigenschaften haben. Nur der Datentyp ist unterschiedlich:</p>
<pre><code>class Tupel {
public:
// [...] Lauter Gemeinsamkeiten, alles identisch vom Aufbau

??? m_value; // Der eigentliche Wert
};
</code></pre>
<p>Ich bekomme den Wert binär codiert über das Protokoll mitgeteilt:</p>
<p><em>Nächster Datentyp: int16<br />
Anzahl Bytes: 2</em></p>
<p>oder</p>
<p><em>Nächster Datentyp: int64 (ist auch das Maximum)<br />
Anzahl Bytes: 8</em></p>
<p>oder</p>
<p>*Nächster Datentyp: BCD2<br />
Anzahl Bytes: 1<br />
*<br />
oder z.B.</p>
<p><em>Nächster Datentyp: Real<br />
Anzahl Bytes: (Gerade nicht im Kopf)</em></p>
<p>Später soll ggfs. mit diesen Daten weiter gerechnet werden. Jetzt bin ich am überlegen, wie ich diese in einer Klasse <em>Tupel</em> am besten speichere.</p>
<p><strong>Mein erster Ansatz</strong><br />
class Tupel als Template-Klasse. Wäre am &quot;saubersten&quot; ist aber Mist, weil ich hinterher an der Netzwerschnittstelle z.B. nicht mehr folgendes machen könnte:</p>
<pre><code>std::vector&lt;Tupel&gt; vecTupel;

NetworkInterface.receive(&amp;vecTupel);

for(std::size_t i=0; i&lt;vecTupel.size(); ++i) {
    cout&lt;&lt;vecTupel[i]&lt;&lt;endl;
}
</code></pre>
<p><strong>Mein Zweiter Ansatz</strong><br />
Ich baue Tupel wie folgt auf:</p>
<pre><code>class Tupel {
public:
// [...] Lauter Gemeinsamkeiten, alles identisch vom Aufbau

Type getType() { [...] };
bool isRawValue() { [...] }
long double m_value; // Der eigentliche Wert
std::int64 m_rawValue; // Die wirklich empfangenen Bytes
};
</code></pre>
<p>Bekomme ich jetzt int16 bis int64 oder real, dann packe ich die in den &quot;long double m_value&quot;. Bekomme ich BCD oder anderen exotischen Kram, landet der in &quot;m_rawValue&quot;. Über &quot;isRawValue&quot; kann der Benutzer dann später prüfen, wo der Wert drinne ist und bei Bedarf mit getType() dann selber entscheiden, was er macht. Nachteile: Man rechnet auch bei ints ständig mit double-Werten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
<p>Was haltet ihr von meinen Ideen? Wie würdet ihr das lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320863/designfrage-datentypübertragung-über-das-netzwerk</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 14:06:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320863.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Oct 2013 08:36:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Designfrage: Datentypübertragung über das Netzwerk on Tue, 15 Oct 2013 08:36:43 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich bekomme Daten über ein definiertes internes Protokoll. Auf das Protokoll habe ich keinen Einfluss, d.h. ich kann nicht die Art der Datenübertragung ändern. Im Prinzip werden mir viele Tupel gesendet, wobei alle Tupel dieselben Eigenschaften haben. Nur der Datentyp ist unterschiedlich:</p>
<pre><code>class Tupel {
public:
// [...] Lauter Gemeinsamkeiten, alles identisch vom Aufbau

??? m_value; // Der eigentliche Wert
};
</code></pre>
<p>Ich bekomme den Wert binär codiert über das Protokoll mitgeteilt:</p>
<p><em>Nächster Datentyp: int16<br />
Anzahl Bytes: 2</em></p>
<p>oder</p>
<p><em>Nächster Datentyp: int64 (ist auch das Maximum)<br />
Anzahl Bytes: 8</em></p>
<p>oder</p>
<p>*Nächster Datentyp: BCD2<br />
Anzahl Bytes: 1<br />
*<br />
oder z.B.</p>
<p><em>Nächster Datentyp: Real<br />
Anzahl Bytes: (Gerade nicht im Kopf)</em></p>
<p>Später soll ggfs. mit diesen Daten weiter gerechnet werden. Jetzt bin ich am überlegen, wie ich diese in einer Klasse <em>Tupel</em> am besten speichere.</p>
<p><strong>Mein erster Ansatz</strong><br />
class Tupel als Template-Klasse. Wäre am &quot;saubersten&quot; ist aber Mist, weil ich hinterher an der Netzwerschnittstelle z.B. nicht mehr folgendes machen könnte:</p>
<pre><code>std::vector&lt;Tupel&gt; vecTupel;

NetworkInterface.receive(&amp;vecTupel);

for(std::size_t i=0; i&lt;vecTupel.size(); ++i) {
    cout&lt;&lt;vecTupel[i]&lt;&lt;endl;
}
</code></pre>
<p><strong>Mein Zweiter Ansatz</strong><br />
Ich baue Tupel wie folgt auf:</p>
<pre><code>class Tupel {
public:
// [...] Lauter Gemeinsamkeiten, alles identisch vom Aufbau

Type getType() { [...] };
bool isRawValue() { [...] }
long double m_value; // Der eigentliche Wert
std::int64 m_rawValue; // Die wirklich empfangenen Bytes
};
</code></pre>
<p>Bekomme ich jetzt int16 bis int64 oder real, dann packe ich die in den &quot;long double m_value&quot;. Bekomme ich BCD oder anderen exotischen Kram, landet der in &quot;m_rawValue&quot;. Über &quot;isRawValue&quot; kann der Benutzer dann später prüfen, wo der Wert drinne ist und bei Bedarf mit getType() dann selber entscheiden, was er macht. Nachteile: Man rechnet auch bei ints ständig mit double-Werten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
<p>Was haltet ihr von meinen Ideen? Wie würdet ihr das lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360372</guid><dc:creator><![CDATA[ArmAberSexy]]></dc:creator><pubDate>Tue, 15 Oct 2013 08:36:43 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Datentypübertragung über das Netzwerk on Tue, 15 Oct 2013 08:46:13 GMT]]></title><description><![CDATA[<p>Wieso überhaupt speichern, du wirst diese Tupel im nächsten Schritt ja sicher noch irgendwie interpretieren wollen!? Man könnte also einfach sowas machen:</p>
<pre><code class="language-cpp">class Interpreter
{
  // ...

  void consume(int16_t v)
  {
    // ...
  }

  void consume(int64_t v)
  {
    // ...
  }

  void consume(double v)
  {
    // ...
  }

  void consume(int v)
  {
    // ...
  }
};

class ValueStream
{
  ...
  void feed(Interpreter&amp; interpreter)
  {
    // Werte lesen und die entsprechenden Methoden des Interpreters aufrufen
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2360374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360374</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 15 Oct 2013 08:46:13 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Datentypübertragung über das Netzwerk on Tue, 15 Oct 2013 09:04:03 GMT]]></title><description><![CDATA[<p>Du hast schon recht, die werden später interpretiert. Aber an einer ganz anderen Stelle und je nach Interpreter auch nicht alle! Deswegen möchte ich gerne eine logische Trennung zwischen diesem Netzwerk/Protokoll und der Verarbeitung haben.</p>
<p>Beispiel:</p>
<pre><code>std::vector&lt;Tupel&gt; vecTupel;

NetworkInterface.receive(&amp;vecTupel);

Interpreter.feed(vecTupel);
</code></pre>
<p>Je nach Art des Interpreters passiert jetzt folgendes:</p>
<pre><code>void Interpreter::feed(std::vector&lt;Tupel&gt;&amp; vecTupel) {
    for(std::size_t i=0; i&lt;vecTupel.size(); ++i) {
        if(vecTupel[i].getDescription() != Tupel::WeatherData) {
              continue;
        }

        if(vecTupel[i].getDescription() == Tupel::Temperature) {
             sumTemperatures += vecTupel[i].m_value; // Bloedes Beispiel
        }

        if(vecTupel[i].getDescription() == Tupel::AirHuminity) {
             currentAirHuminity = vecTupel[i].m_value; 
        }

       // [...]
    }
}
</code></pre>
<p>Ich bekomme also nicht nur Anzahl Bytes und den Datentyp (int16, ...) sondern auch eine Beschreibung was der Tupel darstellt (getDescription()). Das hätte ich erwähnen müssen, sorry.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360376</guid><dc:creator><![CDATA[ArmAberSexy]]></dc:creator><pubDate>Tue, 15 Oct 2013 09:04:03 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Datentypübertragung über das Netzwerk on Tue, 15 Oct 2013 09:44:49 GMT]]></title><description><![CDATA[<p>Ist es paketbasiert oder streambasiert, d.h. gibt es eine eindeutige Paketzuordnung/Trennung? Wenn ja, wie warden die einzelnen Pakete unterschieden? So wie es ausschaut, ist es paketbasiert.</p>
<p>Bei Paketen werden die Daten einfach vollstaendig fuer ein Paket gesammelt (parsen) und der ganze Byteblob einem Konstruktionsmechanismus uebergeben (interpretieren), der das zugehoerige programminterne Objekt erstellt. Dabei muss ein uint8_t nicht zwingend als uint8_t intern dargestellt werden. Wie die Daten intern dargestellt werden haengt vom Einsatzfeld und Anwendung ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360383</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 15 Oct 2013 09:44:49 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Datentypübertragung über das Netzwerk on Tue, 15 Oct 2013 16:14:33 GMT]]></title><description><![CDATA[<p>ArmAberSexy schrieb:</p>
<blockquote>
<p>Du hast schon recht, die werden später interpretiert. Aber an einer ganz anderen Stelle und je nach Interpreter auch nicht alle! Deswegen möchte ich gerne eine logische Trennung zwischen diesem Netzwerk/Protokoll und der Verarbeitung haben.</p>
</blockquote>
<p>Knivils Frage passt da schon ganz gut. Wie lange willst du das mit dem Speichern von empfangenen Daten durchziehen? Bis dir alles wegen mangelndem Speicher um die Ohren fliegt? Klar kannst du empfangene Daten puffern, aber die Größe des verwendeten Buffers sollte dabei von dir bestimmt werden und nicht davon mit wieviel Daten dein Kommunikationspartner dich gerade zufällig so vollballert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360512</guid><dc:creator><![CDATA[alter müllsack]]></dc:creator><pubDate>Tue, 15 Oct 2013 16:14:33 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Datentypübertragung über das Netzwerk on Tue, 15 Oct 2013 16:21:41 GMT]]></title><description><![CDATA[<p>ArmAberSexy schrieb:</p>
<blockquote>
<p>Du hast schon recht, die werden später interpretiert. Aber an einer ganz anderen Stelle und je nach Interpreter auch nicht alle! Deswegen möchte ich gerne eine logische Trennung zwischen diesem Netzwerk/Protokoll und der Verarbeitung haben.</p>
</blockquote>
<p>Perfekt, genau das hast du mit meinem obigen Vorschlag... <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2360515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360515</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 15 Oct 2013 16:21:41 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Datentypübertragung über das Netzwerk on Tue, 15 Oct 2013 17:53:41 GMT]]></title><description><![CDATA[<p>Ich versuche mich mal daran zu orientieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2360538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2360538</guid><dc:creator><![CDATA[ArmAberSexy]]></dc:creator><pubDate>Tue, 15 Oct 2013 17:53:41 GMT</pubDate></item></channel></rss>