<?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[[gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht.]]></title><description><![CDATA[<p>Für eine Netzwerkkommunikation möchte ich IP-Adressen in ein Array aufnehmen. Diese werden als vier einzelne Zahlen eingegeben. Die Rückkonvertierung und alles weitere funktioniert. Nur wollen meine vier Zahlen einfach nicht in eine int. Hab schon mit signed und unsigned, char und int und Uint32 für das Ergebnis herumgespielt, aber ohne irgendeine Auswirkung.<br />
Setze ich für IP direkt hexadezimal einen Wert, wird dieser korrekt eingetragen. Aber mit der unten stehenden Methode, wird immer nur der erste Byte eingetragen. Auch wenn ich es umschreibe, passiert nur etwas bei (Variable &lt;&lt; 24). Andere Bitshifts oder gar keiner wird ignoriert. Hat dieses Byte einen Wert zwischen 0 und 127 bleibt der Rest der 32 Bit langen int 0. Hat dieses Byte einen Wert zwischen 128 und 255, wird der Rest der Bytes in der int mit 255 aufgefüllt.<br />
Es kann sich nur um einen einfachen Konvertierungsfehler handeln. Aber irgendwie muss ich komplett auf dem Schlauch stehen. Google schlägt mir nur meine Methode vor und egal was ich herumprobiere, komme ich zu keinen neuen Erkenntnissen.</p>
<p>Wäre echt nett, wenn jemand wüsste warum das nicht funktionieren will. <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>
<pre><code class="language-cpp">bool GLNet::ServerToIP(unsigned char IP1, unsigned char IP2, unsigned char IP3, unsigned char IP4)
{
    //Testweise andere Werte einsetzen
    IP1 = 127;
    IP2 = 9;
    IP3 = 100;
    IP4 = 255;
	//IP konvertieren
	/*Uint32*/unsigned int IP = (IP1 &lt;&lt; 24) + (IP2 &lt;&lt; 16) + (IP3 &lt;&lt; 8) + IP4 ;
	char Puffer[32] = {0};
	SDLNet_Write32((Uint32)IP, Puffer);
	IPaddress Adresse;
	Adresse.host = (Uint32)*Puffer;
	Adresse.port = Port;

	//In Adressdatenbank eintragen
	if(NumberClients &lt;= 255)
	{
	    ClientIP[NumberClients] = Adresse;
        NumberClients++;
        return true;
	} else {
	    return false;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/285063/gelöst-standardkonvertierung-von-vier-char-in-ein-int-aber-es-funktioniert-nicht</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 12:24:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285063.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 Apr 2011 13:53:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Thu, 14 Apr 2011 18:33:00 GMT]]></title><description><![CDATA[<p>Für eine Netzwerkkommunikation möchte ich IP-Adressen in ein Array aufnehmen. Diese werden als vier einzelne Zahlen eingegeben. Die Rückkonvertierung und alles weitere funktioniert. Nur wollen meine vier Zahlen einfach nicht in eine int. Hab schon mit signed und unsigned, char und int und Uint32 für das Ergebnis herumgespielt, aber ohne irgendeine Auswirkung.<br />
Setze ich für IP direkt hexadezimal einen Wert, wird dieser korrekt eingetragen. Aber mit der unten stehenden Methode, wird immer nur der erste Byte eingetragen. Auch wenn ich es umschreibe, passiert nur etwas bei (Variable &lt;&lt; 24). Andere Bitshifts oder gar keiner wird ignoriert. Hat dieses Byte einen Wert zwischen 0 und 127 bleibt der Rest der 32 Bit langen int 0. Hat dieses Byte einen Wert zwischen 128 und 255, wird der Rest der Bytes in der int mit 255 aufgefüllt.<br />
Es kann sich nur um einen einfachen Konvertierungsfehler handeln. Aber irgendwie muss ich komplett auf dem Schlauch stehen. Google schlägt mir nur meine Methode vor und egal was ich herumprobiere, komme ich zu keinen neuen Erkenntnissen.</p>
<p>Wäre echt nett, wenn jemand wüsste warum das nicht funktionieren will. <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>
<pre><code class="language-cpp">bool GLNet::ServerToIP(unsigned char IP1, unsigned char IP2, unsigned char IP3, unsigned char IP4)
{
    //Testweise andere Werte einsetzen
    IP1 = 127;
    IP2 = 9;
    IP3 = 100;
    IP4 = 255;
	//IP konvertieren
	/*Uint32*/unsigned int IP = (IP1 &lt;&lt; 24) + (IP2 &lt;&lt; 16) + (IP3 &lt;&lt; 8) + IP4 ;
	char Puffer[32] = {0};
	SDLNet_Write32((Uint32)IP, Puffer);
	IPaddress Adresse;
	Adresse.host = (Uint32)*Puffer;
	Adresse.port = Port;

	//In Adressdatenbank eintragen
	if(NumberClients &lt;= 255)
	{
	    ClientIP[NumberClients] = Adresse;
        NumberClients++;
        return true;
	} else {
	    return false;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2048712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048712</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Thu, 14 Apr 2011 18:33:00 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Wed, 13 Apr 2011 14:06:06 GMT]]></title><description><![CDATA[<p>Hab selbst fast keine Ahnung von Bitshifts, aber hast du schonmal versucht die chars erst in einen int zu schreiben und dann zu shiften?</p>
<p>Also int IP1int = IP1... und dann IP1int &lt;&lt; 16 etc.<br />
Vermute das sich der bitshift mit der begrenzten größe von char beißt, aber kannst auch warten bis jemand antwortet der davon Ahnung hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048721</guid><dc:creator><![CDATA[kleiner Troll]]></dc:creator><pubDate>Wed, 13 Apr 2011 14:06:06 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Wed, 13 Apr 2011 14:10:11 GMT]]></title><description><![CDATA[<p>Nicht +, sondern |.</p>
<pre><code class="language-cpp">unsigned int IP = (IP1 &lt;&lt; 24) | (IP2 &lt;&lt; 16) | (IP3 &lt;&lt; 8) | IP4;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2048725</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048725</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 13 Apr 2011 14:10:11 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Wed, 13 Apr 2011 14:20:34 GMT]]></title><description><![CDATA[<p>kleiner Troll schrieb:</p>
<blockquote>
<p>Vermute das sich der bitshift mit der begrenzten größe von char beißt, aber kannst auch warten bis jemand antwortet der davon Ahnung hat.</p>
</blockquote>
<p>Nein, Integer promotion.</p>
<p>_matze schrieb:</p>
<blockquote>
<p>Nicht +, sondern |.</p>
</blockquote>
<p>Auch nein. Was soll da der Unterschied sein?</p>
<p>Der Fehler liegt woanders:</p>
<pre><code class="language-cpp">unsigned char IP1 = 127;
  unsigned char IP2 = 9;
  unsigned char IP3 = 100;
  unsigned char IP4 = 255;

  unsigned int IP = (IP1 &lt;&lt; 24) + (IP2 &lt;&lt; 16) + (IP3 &lt;&lt; 8) + IP4 ; // Oder mit | statt +, ist egal

  std::cout&lt;&lt;IP&lt;&lt;std::endl; // 2131322111. Passt.
</code></pre>
<p>Der Fehler wird in den nachfolgenden Teilen sein. Die Umrechnung macht das was sie soll.</p>
<p>Womit sich die Frage aufdrängt, wie du das getestet hast, dass du zu dieser Aussage kommst:</p>
<blockquote>
<p>Setze ich für IP direkt hexadezimal einen Wert, wird dieser korrekt eingetragen. Aber mit der unten stehenden Methode, wird immer nur der erste Byte eingetragen. Auch wenn ich es umschreibe, passiert nur etwas bei (Variable &lt;&lt; 24). Andere Bitshifts oder gar keiner wird ignoriert. Hat dieses Byte einen Wert zwischen 0 und 127 bleibt der Rest der 32 Bit langen int 0. Hat dieses Byte einen Wert zwischen 128 und 255, wird der Rest der Bytes in der int mit 255 aufgefüllt.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2048736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048736</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 13 Apr 2011 14:20:34 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Wed, 13 Apr 2011 14:48:09 GMT]]></title><description><![CDATA[<p>Ich habe diese Funktion, mit der ich mir eine IP aus der Datenbank in Textform ausgeben lasse:</p>
<pre><code class="language-cpp">std::string GLNet::getClientIP(int number)
{
    //Abbrechen wenn Liste leer
    if(NumberClients == 0) return &quot;Keine IP/No IP&quot;;

	//IP konvertieren
	IPaddress Adresse = ClientIP[number];
	Uint32 IP = SDLNet_Read32 (&amp;Adresse.host);
	int IP1 = (IP &amp; 0xFF000000) &gt;&gt; 24;//IP &gt;&gt; 24);
	int IP2 = (IP &amp; 0x00FF0000) &gt;&gt; 16;//(IP &gt;&gt; 16);
	int IP3 = (IP &amp; 0x0000FF00) &gt;&gt; 8;//(IP &gt;&gt; 8);
	int IP4 = (IP &amp; 0x000000FF);//IP;

	std::stringstream KonvStream1;
    KonvStream1 &lt;&lt; IP1;
    std::string ip1 = KonvStream1.str();

    std::stringstream KonvStream2;
    KonvStream2 &lt;&lt; IP2;
    std::string ip2 = KonvStream2.str();

    std::stringstream KonvStream3;
    KonvStream3 &lt;&lt; IP3;
    std::string ip3 = KonvStream3.str();

    std::stringstream KonvStream4;
    KonvStream4 &lt;&lt; IP4;
    std::string ip4 = KonvStream4.str();

	std::string Text;
	Text = ip1;
	Text += &quot;.&quot;;
	Text += ip2;
	Text += &quot;.&quot;;
	Text += ip3;
	Text += &quot;.&quot;;
	Text += ip4;

	return Text;
}
</code></pre>
<p>Kommentiere ich das Bitshiften aus und schriebe stattdessen int IP = 0xACFFFFFF in meine Problemfunktion direkt ein, erhalte ich 172.255.255.255 als Ausgabe. Gerade nochmal getestet.<br />
Also nach dem Bitshiften macht die Funktion was sie tun soll. Nur in der hier geposteten Version erhalte ich ein 127.0.0.0 und wenn ich IP1 = 128 nehme, erhalte ich 128.255.255.255. Und wie bereits erwähnt, kann ich auskommentieren was ich will, nur wenn ich mit dem &lt;&lt; 24 Bitshift zuordne, passiert etwas mit der Integer, sonst scheint gar nichts zu passieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048761</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Wed, 13 Apr 2011 14:48:09 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Wed, 13 Apr 2011 14:58:47 GMT]]></title><description><![CDATA[<p>Ich bin jetzt etwas verwirrt, was in welcher Reihenfolge geschieht. Aber im Prinzip behauptest du doch, dass folgendes Programm nicht &quot;123.234.110.112&quot; ausgibt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;

std::string getClientIP(int IP)
{
    int IP1 = (IP &amp; 0xFF000000) &gt;&gt; 24;//IP &gt;&gt; 24);
    int IP2 = (IP &amp; 0x00FF0000) &gt;&gt; 16;//(IP &gt;&gt; 16);
    int IP3 = (IP &amp; 0x0000FF00) &gt;&gt; 8;//(IP &gt;&gt; 8);
    int IP4 = (IP &amp; 0x000000FF);//IP;

    std::stringstream KonvStream1;
    KonvStream1 &lt;&lt; IP1;
    std::string ip1 = KonvStream1.str();

    std::stringstream KonvStream2;
    KonvStream2 &lt;&lt; IP2;
    std::string ip2 = KonvStream2.str();

    std::stringstream KonvStream3;
    KonvStream3 &lt;&lt; IP3;
    std::string ip3 = KonvStream3.str();

    std::stringstream KonvStream4;
    KonvStream4 &lt;&lt; IP4;
    std::string ip4 = KonvStream4.str();

    std::string Text;
    Text = ip1;
    Text += &quot;.&quot;;
    Text += ip2;
    Text += &quot;.&quot;;
    Text += ip3;
    Text += &quot;.&quot;;
    Text += ip4;

    return Text;
}

int main()
{
  unsigned char IP1 = 123;
  unsigned char IP2 = 234;
  unsigned char IP3 = 110;
  unsigned char IP4 = 112;

  unsigned int IP = (IP1 &lt;&lt; 24) + (IP2 &lt;&lt; 16) + (IP3 &lt;&lt; 8) + IP4 ;

  std::cout&lt;&lt;getClientIP(IP)&lt;&lt;std::endl;

}
</code></pre>
<p>Und das wird bei dir ja wohl nicht der Fall sein, oder?</p>
<p>Also muss der Fehler in den von mir gekürzten Teilen liegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048772</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 13 Apr 2011 14:58:47 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Wed, 13 Apr 2011 15:14:42 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Adresse.host = (Uint32)*Puffer;
</code></pre>
<p>Ich nehme mal an das soll</p>
<pre><code class="language-cpp">Adresse.host = *(Uint32*)Puffer;
</code></pre>
<p>oder ähnlich heißen.<br />
C-Casts usw...<br />
Außerdem potentiell undefiniert, weil das Array ja nicht korrekt ausgerichtet sein muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048778</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 13 Apr 2011 15:14:42 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Wed, 13 Apr 2011 16:13:39 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>kleiner Troll schrieb:</p>
<blockquote>
<p>Vermute das sich der bitshift mit der begrenzten größe von char beißt, aber kannst auch warten bis jemand antwortet der davon Ahnung hat.</p>
</blockquote>
<p>Nein, Integer promotion.</p>
</blockquote>
<p>Hm, warn Versuch wert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048837</guid><dc:creator><![CDATA[kleiner Troll]]></dc:creator><pubDate>Wed, 13 Apr 2011 16:13:39 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Wed, 13 Apr 2011 16:16:17 GMT]]></title><description><![CDATA[<p>@ Camper, sorry, aber das verstehe ich nicht. Adresse.host ist eine Uint32, also caste ich den inhalt des Arrays Puffer als Uint32. Das ist doch nur (Uint32)*Puffer oder? Bei *(Uint32)*Puffer verstehe ich gerade nicht, was es bewirken soll. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Habs auchmal eingegeben, dann meckert mein Kompiler.<br />
Meinst du mit dem korrekt ausgerichteten Array BigEndian usw.? Das wird durch die SDLNet_Write32 bzw. -Read32 korrigiert.</p>
<p>@ SeppJ, hast recht, habs einfach mal so in die main.cpp eingefügt wie du es geschrieben hast, hat funktioniert. Hab eben auch festgestellt, dass wenn ich IP = 0xACFFFFFF setze die IP zwar 172.255.255.255 ist, dass bei IP = 0xACFF00EE die IP aber weiterhin 172.255.255.255 bleibt. Also muss vom Array irgendwie falsch übertragen werden.</p>
<p>So, nach ein wenig probieren habe ich eine Lösung. Das Array stückweise in ein Int kopieren:</p>
<pre><code class="language-cpp">char Puffer[4] = {0};
	SDLNet_Write32((Uint32)IP, Puffer);
	IPaddress Adresse;
	Uint32 NetIP = (Puffer[0] &lt;&lt; 24) + (Puffer[1] &lt;&lt; 16) + (Puffer[2] &lt;&lt; 8) + Puffer[3];
	//Adresse.host = (Uint32)*Puffer;
	Adresse.host = NetIP;
</code></pre>
<p>Das einzig merkwürdige ist jetzt noch, dass bei diesem Code:</p>
<pre><code class="language-cpp">bool GLNet::ServerToIP(unsigned char IP1, unsigned char IP2, unsigned char IP3, unsigned char IP4)
{
    //Testweise andere Werte einsetzen
    IP1 = 127;
    IP2 = 9;
    IP3 = 101;
    IP4 = 255;
	//IP konvertieren
	/*Uint32*/unsigned int IP = (IP1 &lt;&lt; 24) + (IP2 &lt;&lt; 16) + (IP3 &lt;&lt; 8) + IP4 ;
	char Puffer[4] = {0};
	SDLNet_Write32((Uint32)IP, Puffer);
	IPaddress Adresse;
	Uint32 NetIP = (Puffer[0] &lt;&lt; 24) + (Puffer[1] &lt;&lt; 16) + (Puffer[2] &lt;&lt; 8) + Puffer[3];
	//Adresse.host = (Uint32)*Puffer;
	Adresse.host = NetIP;
	Adresse.port = Port;

	//In Adressdatenbank eintragen
	if(NumberClients &lt;= 255)
	{
	    ClientIP[NumberClients] = Adresse;
        NumberClients++;
        return true;
	} else {
	    return false;
	}
}
</code></pre>
<p>An der Stelle von IP3 eine 100 steht. Setze ich IP3 = 100, steht in der fertigen IP eine 99. Setze ich ihn auf 0, steht an seiner Stelle eine 255 und bei IP2 ist die Zahl um eine Stelle geringer. Kann das an irgendeinem Vorzeichenbit o.ä. liegen?</p>
<p>Momentan verdreht mir SDL auch noch die Reihenfolge. In der Ausgabe erscheint die IP rückwärts, aber das ist ja eine Kleinigkeit. <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/2048839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048839</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Wed, 13 Apr 2011 16:16:17 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Wed, 13 Apr 2011 16:24:24 GMT]]></title><description><![CDATA[<p>Little Programmer schrieb:</p>
<blockquote>
<p>Momentan verdreht mir SDL auch noch die Reihenfolge. In der Ausgabe erscheint die IP rückwärts, aber das ist ja eine Kleinigkeit. <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>
</blockquote>
<p><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=":confused:"
      alt="😕"
    /> Ist das nicht der Sinn des SDL-Aufrufs? Hast du überhaupt eine Ahnung, was du da machst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048847</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 13 Apr 2011 16:24:24 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Wed, 13 Apr 2011 17:04:16 GMT]]></title><description><![CDATA[<p>SDLNet_Write32 dreht die IP in Netzwerkreihenfolge, SDLNet_Read32 beim Auslesen der IP aus der Datenbank dreht sie wieder zurück. Eigentlich müsste sie wieder in der richtigen Reihenfolge heraus kommen.<br />
Um ehrlich zu sein hab ich von Netzwerken an sich und von Netzwerkprogrammierung eigentlich keine Ahnung. Das ist gerade mein erster Versuch in die Richtung. Aber das hat ja nicht viel mit dem Umwandlungsproblem zutun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048875</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Wed, 13 Apr 2011 17:04:16 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Wed, 13 Apr 2011 23:14:05 GMT]]></title><description><![CDATA[<p>Little Programmer schrieb:</p>
<blockquote>
<p>Bei *(Uint32)*Puffer verstehe ich gerade nicht, was es bewirken soll.</p>
</blockquote>
<p>Ich auch nicht. Ist auch nicht das, was ich geschrieben habe.</p>
<p>Little Programmer schrieb:</p>
<blockquote>
<p>Habs auchmal eingegeben, dann meckert mein Kompiler.</p>
</blockquote>
<p>ja, meckern sollte man ihm abgewöhnen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049076</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 13 Apr 2011 23:14:05 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Wed, 13 Apr 2011 23:42:15 GMT]]></title><description><![CDATA[<p>Ah sorry, hatte mich verguckt. Ja, <em>(Uint32</em>)Puffer klingt logisch. Ok, ich bleibe aber lieber bei meiner byteweisen Auslesung, auch wenn da noch der Fehler drin ist, dass IP3 - 1 genommen wird. Mit <em>(Uint32</em>)Puffer hängt sich das Programm in einer Dauerschleife beim Aufruf der Funktion auf. Irgendwo klemmts dann, vielleicht liest es 32 Bit weise den kompletten RAM aus oder ähnliches.</p>
<p>Aber ich steig noch nicht dahinter, was jetzt immer noch schief läuft. Hier die aktuelle Funktion:</p>
<pre><code class="language-cpp">bool GLNet::ServerToIP(unsigned char IP1, unsigned char IP2, unsigned char IP3, unsigned char IP4)
{
    if(NumberClients &lt;= 255)
	{
        //Testweise andere Werte einsetzen
        IP1 = 127;
        IP2 = 9;
        IP3 = 0;
        IP4 = 254;
        //IP konvertieren
        /*Uint32*/unsigned int IP = (IP1 &lt;&lt; 24) + (IP2 &lt;&lt; 16) + (IP3 &lt;&lt; 8) + IP4 ;
        char Puffer[4] = {0};
        SDLNet_Write32((Uint32)IP, Puffer);
        IPaddress Adresse;
        Uint32 NetIP = (Puffer[0] &lt;&lt; 24) + (Puffer[1] &lt;&lt; 16) + (Puffer[2] &lt;&lt; 8) + Puffer[3];
        //Adresse.host = *(Uint32*)Puffer;
        Adresse.host = NetIP;
        Adresse.port = Port;

        //In Adressdatenbank eintragen
        ClientIP[NumberClients] = Adresse;
        NumberClients++;
        return true;
	} else {
	    return false;
	}
}
</code></pre>
<p>Die Ausgabefunktion (hat sich nicht verändert):</p>
<pre><code class="language-cpp">std::string GLNet::getClientIP(int number)
{
    //Abbrechen wenn Liste leer oder kein Eintrag
    if(NumberClients == 0 || number &gt; NumberClients) return &quot;Keine IP/No IP&quot;;

	//IP konvertieren
	IPaddress Adresse = ClientIP[number];
	Uint32 IP = SDLNet_Read32 (&amp;Adresse.host);
	int IP1 = (IP &amp; 0xFF000000) &gt;&gt; 24;//IP &gt;&gt; 24);
	int IP2 = (IP &amp; 0x00FF0000) &gt;&gt; 16;//(IP &gt;&gt; 16);
	int IP3 = (IP &amp; 0x0000FF00) &gt;&gt; 8;//(IP &gt;&gt; 8);
	int IP4 = (IP &amp; 0x000000FF);//IP;

	std::stringstream KonvStream1;
    KonvStream1 &lt;&lt; IP1;
    std::string ip1 = KonvStream1.str();

    std::stringstream KonvStream2;
    KonvStream2 &lt;&lt; IP2;
    std::string ip2 = KonvStream2.str();

    std::stringstream KonvStream3;
    KonvStream3 &lt;&lt; IP3;
    std::string ip3 = KonvStream3.str();

    std::stringstream KonvStream4;
    KonvStream4 &lt;&lt; IP4;
    std::string ip4 = KonvStream4.str();

	std::string Text;
	Text = ip1;
	Text += &quot;.&quot;;
	Text += ip2;
	Text += &quot;.&quot;;
	Text += ip3;
	Text += &quot;.&quot;;
	Text += ip4;

	return Text;
}
</code></pre>
<p>Und die ausgegebene IP-Adresse lautet: 254.5.9.127</p>
<p>Abgesehen von der Reihenfolge habe ich eine 5 anstelle einer 6. Dieses -1 geschieht bei jedem Wert. Setze ich IP3 = 0 ein, so wird auch IP2 um eins reduziert. Die Ausgabe lautet dann 254.255.8.127.<br />
Meine einzige Idee wären Vorzeichenbits, aber ich habe ja unsigned Variablen genommen. Bin grad echt ratlos woher diese Wertänderungen kommen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049080</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Wed, 13 Apr 2011 23:42:15 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Thu, 14 Apr 2011 12:04:45 GMT]]></title><description><![CDATA[<p>Ich habe jetzt folgendes herausgefunden.</p>
<p>Nach diesem Schritt:</p>
<pre><code class="language-cpp">IP1 = 127;
        IP2 = 9;
        IP3 = 3;
        IP4 = 254;
        //IP konvertieren
        /*Uint32*/unsigned int IP = (IP1 &lt;&lt; 24) + (IP2 &lt;&lt; 16) + (IP3 &lt;&lt; 8) + IP4 ;
</code></pre>
<p>Ist IP wie es sein sollte 127.9.3.254.</p>
<p>Nächster Schritt:</p>
<pre><code class="language-cpp">char Puffer[5] = {0};
        SDLNet_Write32((Uint32)IP, Puffer);
        IPaddress Adresse;
        Adresse.host = (Puffer[0] &lt;&lt; 24) + (Puffer[1] &lt;&lt; 16) + (Puffer[2] &lt;&lt; 8) + Puffer[3];
</code></pre>
<p>Hier ist Adresse.host nun 127.9.<strong>2</strong>.254.</p>
<p>Die 2 erhalte ich nur nicht, wenn ich folgendermaßen auskommentiere:</p>
<pre><code class="language-cpp">Adresse.host = (Puffer[0] &lt;&lt; 24) + (Puffer[1] &lt;&lt; 16) + (Puffer[2] &lt;&lt; 8);// + Puffer[3];
//bzw.
Adresse.host = (Puffer[0] &lt;&lt; 24) + (Puffer[1] &lt;&lt; 16) + (Puffer[2] &lt;&lt; 8) + 0xFF;// + Puffer[3];
</code></pre>
<p>Dann ist Adresse.host 127.9.3.0 bzw. 127.9.3.255. Der letzte Byte aus dem Puffer überschreibt die 3 teilweise, aber wie kann das sein, bzw. wie kann ich das verhindern? Wenn ich für den Puffer nur die Länge 4 Bytes nehme, damit er nciht noch Teile vom fünften kopieren kann o.ä., also char Puffer[4] = {0}, ändert das nichts.</p>
<p>Und nun zum zweiten Problem. Während SDLNet_Write32 zumindest auf meinem Computer nichts an der Variablen ändert, kehrt SDLNet_Read32 die Variable um, weshalb ich auch die Ausgabe verkehrt herum hatte. Aber dafür muss ich wohl nochmal wo anders einen Thread starten. SDL-spezifisch gehört hier ja nicht rein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049280</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Thu, 14 Apr 2011 12:04:45 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Thu, 14 Apr 2011 17:02:23 GMT]]></title><description><![CDATA[<p>Das sieht danach aus, als ob du ein Vorzeichen-Problem hast - (signed char)254 == -2. Bei solchen Operationen solltest du lieber mit unsigned char arbeiten und eventuell doch auf Bit-Operationen umstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049498</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 14 Apr 2011 17:02:23 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Thu, 14 Apr 2011 17:36:46 GMT]]></title><description><![CDATA[<p>Ich hab doch schon unsigned char. hatte auch schon als Ziel unsigned Int probiert, aber das hat nichts geändert. Was meinst du mit Bit-Operationen? Bitshiften ist doch eine oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049518</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Thu, 14 Apr 2011 17:36:46 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Thu, 14 Apr 2011 18:35:49 GMT]]></title><description><![CDATA[<p>Little Programmer schrieb:</p>
<blockquote>
<p>Ich hab doch schon unsigned char. hatte auch schon als Ziel unsigned Int probiert, aber das hat nichts geändert.</p>
</blockquote>
<p>Das Endziel ist unsigned, der Zwischenspeicher <code>char Puffer[5];</code> ist es vermutlich nicht<sup>*</sup>.</p>
<blockquote>
<p>Was meinst du mit Bit-Operationen? Bitshiften ist doch eine oder?</p>
</blockquote>
<p>Es wurde zwar schonmal erwähnt, aber Bit-Oder gehört auch dazu.</p>
<p>Edit: (da ist doch glatt eine Fußnote verlorengegangen)<br />
<sup>*</sup> ob ein blanker &quot;char&quot; vorzeichenbehaftet ist oder nicht, ist compilerspezifisch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049525</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 14 Apr 2011 18:35:49 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Standardkonvertierung von vier char in ein int, aber es funktioniert nicht. on Thu, 14 Apr 2011 18:32:11 GMT]]></title><description><![CDATA[<p>Ah, klar. Jetzt wo du's sagst. An unsigned char Puffer[5] hatte ich gar nicht gedacht. Jetzt funktionierts. Halt abgesehen von der SDL-Umwandlung, aber das ist ein anderes Thema. Ging hier ja nur um die vier Bytes in eine Int.</p>
<p>Vielen Dank an alle die mir geholfen haben. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2049557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049557</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Thu, 14 Apr 2011 18:32:11 GMT</pubDate></item></channel></rss>