<?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[Mir unbegreifliches Phänomen von char* -&amp;gt; int]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich sitz hier vor einer Funktion, die eigentlich beliebig große Strings (char*) in einen Integer umwandelt (unsigned). Aber unter gewissen Umständen funktioniert der Code nicht. Ich hab mal ein Minimalbeispiel geschrieben, dass bei mir den Fehler verursacht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

template&lt;typename T&gt;
inline T unmarshalPropertyBig(char* buffer, size_t length)
{
    size_t index = 0;
    T value = buffer[index++];
    while(index &lt; length)
    {
        value &lt;&lt;= 8;
        value |= buffer[index++];
    }
    return value;
}

int main()
{
    char buffer[2];
    buffer[0] = 0x10;
    buffer[1] = 0x79;

    cout &lt;&lt; unmarshalPropertyBig&lt;unsigned short&gt;(buffer, 2) &lt;&lt; endl; // 4217 ok

    buffer[0] = 0x10;
    buffer[1] = 0x80;

    cout &lt;&lt; unmarshalPropertyBig&lt;unsigned short&gt;(buffer, 2) &lt;&lt; endl; // 65408 ?????
    // 65408 = 0xFF80 (in Zeile 12 scheint der Fehler zu passieren)

    return 0;
}
</code></pre>
<p>Ich wandel also einmal 0x1079 und das zweite mal 0x1080 in einen passenden short um. Aber warum funktioniert das zweite nicht (in Zeile 12 scheint der Fehler zu passieren)?</p>
<p>Ich wäre euch sehr dankbar, wenn ihr mir einen Tip geben könntet!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/235991/mir-unbegreifliches-phänomen-von-char-gt-int</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 03:13:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/235991.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Mar 2009 14:31:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mir unbegreifliches Phänomen von char* -&amp;gt; int on Mon, 09 Mar 2009 14:31:41 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich sitz hier vor einer Funktion, die eigentlich beliebig große Strings (char*) in einen Integer umwandelt (unsigned). Aber unter gewissen Umständen funktioniert der Code nicht. Ich hab mal ein Minimalbeispiel geschrieben, dass bei mir den Fehler verursacht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

template&lt;typename T&gt;
inline T unmarshalPropertyBig(char* buffer, size_t length)
{
    size_t index = 0;
    T value = buffer[index++];
    while(index &lt; length)
    {
        value &lt;&lt;= 8;
        value |= buffer[index++];
    }
    return value;
}

int main()
{
    char buffer[2];
    buffer[0] = 0x10;
    buffer[1] = 0x79;

    cout &lt;&lt; unmarshalPropertyBig&lt;unsigned short&gt;(buffer, 2) &lt;&lt; endl; // 4217 ok

    buffer[0] = 0x10;
    buffer[1] = 0x80;

    cout &lt;&lt; unmarshalPropertyBig&lt;unsigned short&gt;(buffer, 2) &lt;&lt; endl; // 65408 ?????
    // 65408 = 0xFF80 (in Zeile 12 scheint der Fehler zu passieren)

    return 0;
}
</code></pre>
<p>Ich wandel also einmal 0x1079 und das zweite mal 0x1080 in einen passenden short um. Aber warum funktioniert das zweite nicht (in Zeile 12 scheint der Fehler zu passieren)?</p>
<p>Ich wäre euch sehr dankbar, wenn ihr mir einen Tip geben könntet!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676774</guid><dc:creator><![CDATA[Tobias W]]></dc:creator><pubDate>Mon, 09 Mar 2009 14:31:41 GMT</pubDate></item><item><title><![CDATA[Reply to Mir unbegreifliches Phänomen von char* -&amp;gt; int on Mon, 09 Mar 2009 14:46:42 GMT]]></title><description><![CDATA[<p>Nimm mal als ersten Funktionsparameter</p>
<p>unsigned char*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676783</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 09 Mar 2009 14:46:42 GMT</pubDate></item><item><title><![CDATA[Reply to Mir unbegreifliches Phänomen von char* -&amp;gt; int on Mon, 09 Mar 2009 19:02:03 GMT]]></title><description><![CDATA[<p>Vielen Dank, das hat das Problem gelöst.</p>
<p>Leider bin ich noch ein bisschen am rätseln, was genau der Compiler ab 128 in Zeile 12 genau macht. Kannst du das noch erläutern?</p>
<p>Auf jeden Fall bin ich dir sehr dankbar!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676957</guid><dc:creator><![CDATA[Tobias W]]></dc:creator><pubDate>Mon, 09 Mar 2009 19:02:03 GMT</pubDate></item><item><title><![CDATA[Reply to Mir unbegreifliches Phänomen von char* -&amp;gt; int on Mon, 09 Mar 2009 20:12:48 GMT]]></title><description><![CDATA[<p>Nein, ich kann Dir das leider auch nicht genau sagen. Aber 0x80 ist ein Charakter mit gesetztem MSB, wird also als negativ interpretiert, wenn Du es einem signed char zuweist.<br />
Bei Deiner Operation in Zeile 12 wird es vermutlich erst mal konvertiert (in einen short?). Es kann sein, daß bei dieser Konvertierung das MSB erhalten bleibt, Du dabei also so etwas wie 1000 0000 0000 0000 bekommst - das würde allerdings noch nicht das Endergebnis erklären ...<br />
Es kann aber immer problematisch sein, unsigned und signed Typen zu mixen.<br />
Lös doch mal die Zeile 12 auf in Zuweisung an unsigned short und anschließende Veroderung und schau Dir alle Werte zwischendurch immer an. Evtl. hilft das, das genaue Verhalten aufzuklären?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1676976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1676976</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 09 Mar 2009 20:12:48 GMT</pubDate></item><item><title><![CDATA[Reply to Mir unbegreifliches Phänomen von char* -&amp;gt; int on Tue, 10 Mar 2009 01:55:25 GMT]]></title><description><![CDATA[<p>Die Erweiterung von 0x80 auf signed(!) short wäre 0xFF80, dann kann da im ersten char drin stehen was will, es wird dadurch immer zu 0xFF80.</p>
<p>Das Problem passiert bei der Erweiterung des nicht spezifizierten char auf short.<br />
Dabei spielt der Vorzeichentyp des Ziels keine Rolle, sondern offensichtlich der der Quelle (der ebenfalls offensichtlich signed ist). Dies wird der Länge des Ziels angepasst und voila, schon ist das Ungewollte passiert.</p>
<p>Du gehst auf Nummer Sicher, wenn Du schreibst:<br />
value |= buffer[index++] &amp; 0x00FF;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677052</guid><dc:creator><![CDATA[Bitsy]]></dc:creator><pubDate>Tue, 10 Mar 2009 01:55:25 GMT</pubDate></item></channel></rss>