<?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[my_htons - funktioniert das immer?]]></title><description><![CDATA[<p>Ich habe gerade hier im Forum einen Artikel zwecks Sockets/HTTP gefunden. Dabei hab ich mich gefragt, ob das hier immer geht oder ob es da auf irgendwelchen exotischen Plattformen Probleme geben kann:</p>
<pre><code class="language-cpp">unsigned short my_htons(unsigned short h)
{
    char* p = reinterpret_cast&lt;char*&gt;(&amp;h);
    char n[2];
    n[0] = p[1];
    n[1] = p[0];
    return *reinterpret_cast&lt;unsigned short*&gt;(n);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/304086/my_htons-funktioniert-das-immer</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 00:08:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/304086.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 May 2012 14:19:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Tue, 29 May 2012 14:19:33 GMT]]></title><description><![CDATA[<p>Ich habe gerade hier im Forum einen Artikel zwecks Sockets/HTTP gefunden. Dabei hab ich mich gefragt, ob das hier immer geht oder ob es da auf irgendwelchen exotischen Plattformen Probleme geben kann:</p>
<pre><code class="language-cpp">unsigned short my_htons(unsigned short h)
{
    char* p = reinterpret_cast&lt;char*&gt;(&amp;h);
    char n[2];
    n[0] = p[1];
    n[1] = p[0];
    return *reinterpret_cast&lt;unsigned short*&gt;(n);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2216785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2216785</guid><dc:creator><![CDATA[Funktionierer]]></dc:creator><pubDate>Tue, 29 May 2012 14:19:33 GMT</pubDate></item><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Tue, 29 May 2012 14:22:47 GMT]]></title><description><![CDATA[<p>afaik ist reinterpret cast böse</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2216788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2216788</guid><dc:creator><![CDATA[memcpy]]></dc:creator><pubDate>Tue, 29 May 2012 14:22:47 GMT</pubDate></item><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Tue, 29 May 2012 14:34:35 GMT]]></title><description><![CDATA[<p>Wenn du eh immer davon ausgehst, dass short 16 bit groß ist, warum machst du dann nicht einfach</p>
<pre><code class="language-cpp">unsigned short my_htons(unsigned short h)
{
    return h &gt;&gt; 8 | (h &amp; 0xff) &lt;&lt; 8;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2216800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2216800</guid><dc:creator><![CDATA[Wall-E]]></dc:creator><pubDate>Tue, 29 May 2012 14:34:35 GMT</pubDate></item><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Tue, 29 May 2012 14:36:16 GMT]]></title><description><![CDATA[<p>Klar, wenn du auf Systemen bist mit big endian bist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2216801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2216801</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 29 May 2012 14:36:16 GMT</pubDate></item><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Tue, 29 May 2012 14:37:00 GMT]]></title><description><![CDATA[<p>Das funktioniert z.B. nicht, wenn Host- und Network-Order übereinstimmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2216803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2216803</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 29 May 2012 14:37:00 GMT</pubDate></item><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Tue, 29 May 2012 18:44:43 GMT]]></title><description><![CDATA[<p>Dafür gibt es bereits fertige Funktionen die zusammen mit der socket API ausgeliefert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2216968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2216968</guid><dc:creator><![CDATA[tippgeber]]></dc:creator><pubDate>Tue, 29 May 2012 18:44:43 GMT</pubDate></item><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Tue, 29 May 2012 18:50:01 GMT]]></title><description><![CDATA[<p>memcpy schrieb:</p>
<blockquote>
<p>afaik ist reinterpret cast böse</p>
</blockquote>
<p>Noja, der erste geht schon klar. Der zweite eher nicht mehr. Aber das Alignment ist hier z.B. nicht garantiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2216970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2216970</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 29 May 2012 18:50:01 GMT</pubDate></item><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Tue, 29 May 2012 19:43:50 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>reinterpret_cast erzeugt ggf. undefiniertes Verhalten. Zum Beispiel hier:</p>
<pre><code class="language-cpp">auto _= [](){};//Pumuckls liebling
      void* ptr = reinterpret_cast&lt;void*&gt;(&amp;_);
      (*reinterpret_cast&lt;decltype(_)*&gt;(ptr))();
</code></pre>
</blockquote>
<p>Das ist doch schlicht ein Slicing-Problem, sollte jedem klar sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217015</guid><dc:creator><![CDATA[Ethon_]]></dc:creator><pubDate>Tue, 29 May 2012 19:43:50 GMT</pubDate></item><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Tue, 29 May 2012 19:58:58 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Wegen Forenposts wurden Leute schon rechtlich belangt, deshalb sollte man Foren meiden.</p>
</blockquote>
<p>Na und? Prostitution ist auch verboten. Trollen ist verboten. In New York ist es verboten, einen Elch in der Badewanne schlafen zu lassen oder Frauen hinterherzugucken. Trotzdem macht es jeder.</p>
<p>Ethon_ schrieb:</p>
<blockquote>
<p>Hacker schrieb:</p>
<blockquote>
<p>reinterpret_cast erzeugt ggf. undefiniertes Verhalten. Zum Beispiel hier:</p>
<pre><code class="language-cpp">auto _= [](){};//Pumuckls liebling
      void* ptr = reinterpret_cast&lt;void*&gt;(&amp;_);
      (*reinterpret_cast&lt;decltype(_)*&gt;(ptr))();
</code></pre>
</blockquote>
<p>Das ist doch schlicht ein Slicing-Problem, sollte jedem klar sein.</p>
</blockquote>
<p>Undefiniert ist undefiniert. Einen Funktionszeiger zu <code>void*</code> zu konvertieren wird vom Standard nicht berücksichtigt (ich hätte hier auch explizit eine globale Funktion nehmen können).</p>
</blockquote>
<p>Verstehe ich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217021</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 29 May 2012 19:58:58 GMT</pubDate></item><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Tue, 29 May 2012 20:14:13 GMT]]></title><description><![CDATA[<p>Eine Lambda ist keine Funktion, auch wenn man sie konvertieren kann.</p>
<p>Hacker schrieb:</p>
<blockquote>
<p>Undefiniert ist undefiniert. Einen Funktionszeiger zu <code>void*</code> zu konvertieren wird vom Standard nicht berücksichtigt (ich hätte hier auch explizit eine globale Funktion nehmen können).</p>
</blockquote>
<p>De facto wird es berücksichtigt, auch wenn das Verhalten nicht garantiert ist. Siehe dazu Abschnitt:</p>
<p>n3376 5.2.10/8 schrieb:</p>
<blockquote>
<p>Converting a function pointer to an object pointer type or vice versa is conditionally-supported. The meaning of such a conversion is implementation-defined, except that if an implementation supports conversions in both irections, converting a prvalue of one type to the other type and back, possibly with different cvqualification, shall yield the original pointer value.</p>
</blockquote>
<p>Zudem hast du Pi's Kommentar nicht verstanden, denk da noch mal drüber nach. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217025</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 29 May 2012 20:14:13 GMT</pubDate></item><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Tue, 29 May 2012 20:19:51 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Stopp. Pis kommentar war doch nur Troll, oder hat er eine subtile Aussage gemacht? Die ich nicht blicke?</p>
</blockquote>
<p>Jo.</p>
<p>Hacker schrieb:</p>
<blockquote>
<p>Aber <code>void*</code> ist doch kein Object-Pointer? Ich dachte, ein Object-Pointer ist ein Zeiger auf eine Instanz einer Klasse?</p>
</blockquote>
<p>Nein.</p>
<p>n3376 3.9.2/3 Erster Satz schrieb:</p>
<blockquote>
<p>The type of a pointer to void or a pointer to an object type is called an object pointer type.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2217028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217028</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 29 May 2012 20:19:51 GMT</pubDate></item><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Wed, 30 May 2012 09:13:49 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Ich dachte, ein Object-Pointer ist ein Zeiger auf eine Instanz einer Klasse?</p>
</blockquote>
<p>&quot;object&quot;s sind im Standardese alles, was Speicher belegt. Objektpointer sind damit Poitner auf irgendwas im Speicher, oder schlichtweg Speicheradressen, im Gegensatz zu Funktiosadressen/Memberfunktionsadressen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217148</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 30 May 2012 09:13:49 GMT</pubDate></item><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Wed, 30 May 2012 10:05:32 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Prostitution ist auch verboten.</p>
</blockquote>
<p>Was'n das für ne Aussage? Auf welche Gesetzgebung beschränkst du dich da denn?</p>
<p>Ich finde solche Funktionen wie htons, die sowohl 'nen int fressen als auch wieder ausspucken irgendwie sinnfrei. Es sind doch nur Zahlen. Klingt so, als ob da jemand Daten in ein struct packen und direkt senden will, als sei da irgend ein Layout garantiert. Pfui.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217172</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 30 May 2012 10:05:32 GMT</pubDate></item><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Wed, 30 May 2012 11:19:49 GMT]]></title><description><![CDATA[<blockquote>
<p>die sowohl 'nen int fressen als auch wieder ausspucken irgendwie sinnfrei</p>
</blockquote>
<p>Wat dat denn fuer 'ne Argumentation? Dann findest du Funktionen, die einen double fressen und wieder ausspucken auch sinnfrei? sin, cos, tan, ... Darueber hinaus: Der PC kennt keine Zahlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217210</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 30 May 2012 11:19:49 GMT</pubDate></item><item><title><![CDATA[Reply to my_htons - funktioniert das immer? on Wed, 30 May 2012 12:28:24 GMT]]></title><description><![CDATA[<p>knivil, htos soll zur <a href="http://de.wikipedia.org/wiki/Code" rel="nofollow">Kodierung/Dekodierung</a> eingesetzt werden. Da geht's also um Mappings zwischen Ganzzahlen und Byte-Sequenzen. In der Sprache C++ haben wir Ganzzahltypen für Ganzzahlen und so etwas wie char[] oder ähnliches für Byte-Sequenzen. Eine Funktion zur Kodierung/Dekodierung die ints frisst und ints ausspuckt, lädt nur dazu ein, so etwas zu schreiben:</p>
<pre><code class="language-cpp">struct chunk
{
  char id[4];
  uint32_t size;
};

int main()
{
  ...
  chunk c = {{'R','I','F','F'}, host2le(99)}; // le = little endian
  file.write(reinterpret_cast&lt;char*&gt;(&amp;c),sizeof c);
  ...
}
</code></pre>
<p>und das ist generell böse, weil der Compiler beim Layout solcher Typen Lücken einfügen darf (Padding).</p>
<p>Ich wär eher für so etwas wie</p>
<pre><code class="language-cpp">template&lt;class OctetOutputIter&gt;
void write_int16le(OctetOutputIter &amp; oo, unsigned short x)
{
  *oo++ = x &amp; 0xFFu;
  *oo++ = (x &gt;&gt; 8) &amp; 0xFFu;
}
</code></pre>
<p>Da gibt's sicherlich auch lustige C++ Bibliotheken, die das angenehmeer gestalten, mich ein Binärformat in einer EDSL ausdrücken lassen und automatisch ein solches struct portabel serialisieren können mit ein bissel Metaprogramming. <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/2217235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217235</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 30 May 2012 12:28:24 GMT</pubDate></item></channel></rss>