<?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[[Design] Aus char&#x2F;byte Array (Socket Empfangspuffer) structs extrahieren]]></title><description><![CDATA[<p>Hi,</p>
<p>ich bekomme von einem Sensor kontinuierlich Messwerte (floats). Jeweils vier davon gehören immer zusammen (= Quaternion).<br />
Die Verbindung zwischen PC und Sensor läuft über Bluetooth (Serial Port Profile) und einen Socket.</p>
<p>Könnte man die Extraktion der Quaternionen aus dem Byte-Strom eleganter machen, als wie bisher (siehe Code)?</p>
<p>Endianess, Network-Byte-Order, Datentyp-Größenunterschiede sollen erstmal keine Rolle spielen. Alles bisher nur auf Windows 7, Visual Studio 2010.</p>
<pre><code class="language-cpp">struct Quaternion
	{
		float x0, x1, x2, x3;
	};

	...

	std::array&lt;char, 4096&gt; rbuffer; 
	for (;;)
	{
		err = recv(s, &amp;rbuffer[0], rbuffer.size(), 0);
		// ... error handling ..

		for (auto it = rbuffer.begin(); it != rbuffer.end(); std::advance(it, sizeof(Quaternion))
		{
			Quaternion q;
			std::memcpy(&amp;(*it), &amp;q, sizeof(Quaternion));

			handleQuaternion(q); //ggf. std::vector&lt;Quaternion&gt; + handleQuaternionVector outside loop
		}
	}
</code></pre>
<p>Danke!<br />
rbd</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291642/design-aus-char-byte-array-socket-empfangspuffer-structs-extrahieren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 15:31:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291642.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Aug 2011 16:36:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Design] Aus char&#x2F;byte Array (Socket Empfangspuffer) structs extrahieren on Tue, 23 Aug 2011 16:36:25 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich bekomme von einem Sensor kontinuierlich Messwerte (floats). Jeweils vier davon gehören immer zusammen (= Quaternion).<br />
Die Verbindung zwischen PC und Sensor läuft über Bluetooth (Serial Port Profile) und einen Socket.</p>
<p>Könnte man die Extraktion der Quaternionen aus dem Byte-Strom eleganter machen, als wie bisher (siehe Code)?</p>
<p>Endianess, Network-Byte-Order, Datentyp-Größenunterschiede sollen erstmal keine Rolle spielen. Alles bisher nur auf Windows 7, Visual Studio 2010.</p>
<pre><code class="language-cpp">struct Quaternion
	{
		float x0, x1, x2, x3;
	};

	...

	std::array&lt;char, 4096&gt; rbuffer; 
	for (;;)
	{
		err = recv(s, &amp;rbuffer[0], rbuffer.size(), 0);
		// ... error handling ..

		for (auto it = rbuffer.begin(); it != rbuffer.end(); std::advance(it, sizeof(Quaternion))
		{
			Quaternion q;
			std::memcpy(&amp;(*it), &amp;q, sizeof(Quaternion));

			handleQuaternion(q); //ggf. std::vector&lt;Quaternion&gt; + handleQuaternionVector outside loop
		}
	}
</code></pre>
<p>Danke!<br />
rbd</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109744</guid><dc:creator><![CDATA[RBd]]></dc:creator><pubDate>Tue, 23 Aug 2011 16:36:25 GMT</pubDate></item><item><title><![CDATA[Reply to [Design] Aus char&#x2F;byte Array (Socket Empfangspuffer) structs extrahieren on Tue, 23 Aug 2011 19:40:41 GMT]]></title><description><![CDATA[<p>Du gehst davon aus, dass du immer den gesamten Puffer voll liest, worauf du dich allerdings nicht verlassen kannst:<br />
<a href="http://msdn.microsoft.com/en-us/library/ms740121(v=vs.85).aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ms740121(v=vs.85).aspx</a></p>
<p>Warum liest du eigentlich in einen Puffer, wenn du danach eh nur in die Struktur kopierst? Dann kannste auch gleich in den struct-Speicherbereich lesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109801</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Tue, 23 Aug 2011 19:40:41 GMT</pubDate></item><item><title><![CDATA[Reply to [Design] Aus char&#x2F;byte Array (Socket Empfangspuffer) structs extrahieren on Wed, 24 Aug 2011 07:22:21 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct Quaternion
{
   float x0, x1, x2, x3;
};

    ...

std::array&lt;char, 4096&gt; rbuffer; 
for (;;)
{
   err = recv(s, &amp;rbuffer[0], rbuffer.size(), 0);

   // error handling
   unsigned int Available = err;
   unsigned int Offset = 0;

   while( Available &gt;= sizeof( Quaternion ) )
   {
      Quaternion* Current = reinterpret_cast&lt;Quaternion*&gt;( rbuffer[Offset] );
      handleQuaternion( *Current );

      Offset += sizeof( Quaternion );
      Available -= sizeof( Quaternion );
   }
}
</code></pre>
<p>Du hast allerdings noch ein anderes Problem, du gehst nämlich davon aus, dass immer komplette Quaternion Daten gelesen werden. Das garantiert TCP/IP aber nicht, aufgrund der Protokolleigenschaften dürfen Pakete auch fragmentiert werden. Das könnte zur Folge haben (Empfang von 4 Quaternionen), dass der erste recv Aufruf 16 Bytes liest (1 komplette Quaternion), der zweite und dritte Aufruf liefern aber jeweils 24 Byte. Damit wären alle Daten übertragen (64 Byte, TCP/IP hat seinen Job korrekt erledigt), aber du kommst in´s Stolpern.<br />
Du brauchst einen FIFO, in den hinten die gelesenen Daten angehängt werden und die behandelten Daten von vorne gelöscht werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109950</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Wed, 24 Aug 2011 07:22:21 GMT</pubDate></item><item><title><![CDATA[Reply to [Design] Aus char&#x2F;byte Array (Socket Empfangspuffer) structs extrahieren on Wed, 24 Aug 2011 08:24:08 GMT]]></title><description><![CDATA[<p>Erstmal danke für eure Antworten und Hinweise.</p>
<p>Ihr habt Recht, ich müsste prüfen, wieviel wirklich im Puffer ist.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24036">@XSpille</a>:<br />
Wegen der Zweiteilung 1) in Puffer 2) dann in structs: Ich dachte, dass es da vielleicht einige elegante Methode mittels Iteratoren gibt. Quasi immer über Block von 4 Floats iterieren und dass dann in ein Quaternion schreiben. Ähnlich wie man es mit <code>istream_iterator</code> machen würde.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18927">@DocShoe</a>: Fragmentierung dürfte nicht das Problem sein, die Übertragung läuft <strong>nicht</strong> mittels TCP/IP, sondern über serielle Schnittstelle (Bluetooth: Serial Port Profile). Unvollständig wird es IMHO doch erst, wenn die Verbindung abbricht. Da müsste man sich dann drum kümmern und den Rest wegwerfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109969</guid><dc:creator><![CDATA[RBd]]></dc:creator><pubDate>Wed, 24 Aug 2011 08:24:08 GMT</pubDate></item></channel></rss>