<?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[Advanced ByteToInt]]></title><description><![CDATA[<p>Hallo, (ja, ich bins mal wieder^^)</p>
<p>Es geht darum, dass ich nen riesigen Array mit<br />
Bytes habe (meiste davon is trash), nun habe ich eine<br />
Stelle lokalisiert an der sich eine Zahl befindet die ich brauche,<br />
das Problem ist nur, sie ist 2 bytes lang.<br />
Wenn sie nur ein byte lang wäre hätte ich es so gemacht</p>
<pre><code class="language-cpp">(int)myData[1234]
</code></pre>
<p>aber ich muss iergendwie hinkriegen,<br />
dass es die zwei Ziffern<br />
zb:</p>
<pre><code class="language-cpp">17 E0
</code></pre>
<p>als eine Zahl ansieht (6112)</p>
<p>Ich hoffe ihr versteht was ich meine.</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/170179/advanced-bytetoint</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Jul 2026 23:07:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170179.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 Jan 2007 14:24:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Advanced ByteToInt on Fri, 12 Jan 2007 14:24:48 GMT]]></title><description><![CDATA[<p>Hallo, (ja, ich bins mal wieder^^)</p>
<p>Es geht darum, dass ich nen riesigen Array mit<br />
Bytes habe (meiste davon is trash), nun habe ich eine<br />
Stelle lokalisiert an der sich eine Zahl befindet die ich brauche,<br />
das Problem ist nur, sie ist 2 bytes lang.<br />
Wenn sie nur ein byte lang wäre hätte ich es so gemacht</p>
<pre><code class="language-cpp">(int)myData[1234]
</code></pre>
<p>aber ich muss iergendwie hinkriegen,<br />
dass es die zwei Ziffern<br />
zb:</p>
<pre><code class="language-cpp">17 E0
</code></pre>
<p>als eine Zahl ansieht (6112)</p>
<p>Ich hoffe ihr versteht was ich meine.</p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208773</guid><dc:creator><![CDATA[Listing]]></dc:creator><pubDate>Fri, 12 Jan 2007 14:24:48 GMT</pubDate></item><item><title><![CDATA[Reply to Advanced ByteToInt on Fri, 12 Jan 2007 15:00:10 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Die einzelnen Bytes als unsigned char auslesen und mit Bitshifting in einen Integer zusammensetzen.</p>
<pre><code class="language-cpp">unsigned char a = 10;
unsigned char b = 20;
unsigned int c = (unsigned int(a) &lt;&lt; 8) + b;
</code></pre>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208785</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 12 Jan 2007 15:00:10 GMT</pubDate></item><item><title><![CDATA[Reply to Advanced ByteToInt on Fri, 12 Jan 2007 15:29:30 GMT]]></title><description><![CDATA[<p>akari schrieb:</p>
<blockquote>
<p>Hallo</p>
<p>Die einzelnen Bytes als unsigned char auslesen und mit Bitshifting in einen Integer zusammensetzen.</p>
<pre><code class="language-cpp">unsigned char a = 10;
unsigned char b = 20;
unsigned int c = (unsigned int(a) &lt;&lt; 8) + b;
</code></pre>
<p>bis bald<br />
akari</p>
</blockquote>
<p>Respekt, ich wusste noch nicht dass sowas existiert, kannst du mir bitte erklären wie die 8 zustande kommt?</p>
<p>Danke schonmal,<br />
es funktioniert einwandfrei</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208812</guid><dc:creator><![CDATA[Listing]]></dc:creator><pubDate>Fri, 12 Jan 2007 15:29:30 GMT</pubDate></item><item><title><![CDATA[Reply to Advanced ByteToInt on Fri, 12 Jan 2007 15:33:58 GMT]]></title><description><![CDATA[<p>Ein Byte hat 8 Bit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208818</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 12 Jan 2007 15:33:58 GMT</pubDate></item><item><title><![CDATA[Reply to Advanced ByteToInt on Fri, 12 Jan 2007 16:11:12 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Ein Byte hat 8 Bit.</p>
</blockquote>
<p>Nicht unbedingt...<br />
Etwas genauer also: <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>
<pre><code class="language-cpp">unsigned char a = 10;
unsigned char b = 20;
unsigned int c = ( a &lt;&lt; CHAR_BIT ) | b;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1208845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208845</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Fri, 12 Jan 2007 16:11:12 GMT</pubDate></item><item><title><![CDATA[Reply to Advanced ByteToInt on Fri, 12 Jan 2007 16:13:09 GMT]]></title><description><![CDATA[<p>Jetzt ist es portabel <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/1208850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208850</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 12 Jan 2007 16:13:09 GMT</pubDate></item><item><title><![CDATA[Reply to Advanced ByteToInt on Fri, 12 Jan 2007 16:13:23 GMT]]></title><description><![CDATA[<p>gibt es systeme, für die c++ compiler existieren, die nicht 8 bit pro byte nutzen? von irgendwelchen speziallösungen im embedded bereich mal abgesehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208851</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Fri, 12 Jan 2007 16:13:23 GMT</pubDate></item><item><title><![CDATA[Reply to Advanced ByteToInt on Fri, 12 Jan 2007 17:29:50 GMT]]></title><description><![CDATA[<p>thordk schrieb:</p>
<blockquote>
<p>gibt es systeme, für die c++ compiler existieren, die nicht 8 bit pro byte nutzen? von irgendwelchen speziallösungen im embedded bereich mal abgesehen.</p>
</blockquote>
<p>Ya, durchaus: <a href="http://www.parashift.com/c++-faq-lite/intrinsic-types.html#faq-26.4" rel="nofollow">http://www.parashift.com/c++-faq-lite/intrinsic-types.html#faq-26.4</a></p>
<p>Machs so:</p>
<pre><code class="language-cpp">template&lt; unsigned bits &gt;
class CharToUInt
{
	typedef TYPE_LIST_4( unsigned char, unsigned short, unsigned int, unsigned long ) unsigned_integrals;

public:
	typedef typename TL::TypeBySize&lt; unsigned_integrals, bits &gt;::Type IntType;

	static IntType Convert( char c1, char c2 )
	{
		assert( ( sizeof( char ) * 2 ) &lt;= sizeof( IntType ) );
		return static_cast&lt; IntType &gt;( ( c1 &lt;&lt; CHAR_BIT ) | c2 );
	}

	static IntType Convert( char c1, char c2, char c3 )
	{
		assert( ( sizeof( char ) * 3 ) &lt;= sizeof( IntType ) );
		return static_cast&lt; IntType &gt;( ( c1 &lt;&lt; CHAR_BIT * 2 ) | ( c2 &lt;&lt; CHAR_BIT ) | c3 );
	}

	static IntType Convert( char c1, char c2, char c3, char c4 )
	{
		assert( ( sizeof( char ) * 4 ) &lt;= sizeof( IntType ) );
		return static_cast&lt; IntType &gt;( ( c1 &lt;&lt; CHAR_BIT * 3 ) | ( c2 &lt;&lt; CHAR_BIT * 2 ) | ( c3 &lt;&lt; CHAR_BIT ) | c4 );
	}
};
</code></pre>
<p>Das TYPE_LIST_X Macro, sowie die TypeList Templates sind aus Andrei Alexandrescu's Modern C++ Design geliehen! <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="😉"
    /> Folgende Funktionalität hab ich dazu gebastelt:</p>
<pre><code class="language-cpp">template&lt; typename TList, unsigned int bits &gt;
struct TypeBySize;

template&lt; unsigned int bits &gt;
struct TypeBySize&lt; NullType, bits &gt;
{
	typedef void Type;
};

template&lt; typename T, typename U, unsigned int bits &gt;
struct TypeBySize&lt; TypeList&lt; T, U &gt;, bits &gt;
{
	typedef typename Select&lt; ( ( sizeof( T ) * CHAR_BIT ) == bits ), T, typename TypeBySize&lt; U, bits &gt;::Type &gt;::Result Type;
};
</code></pre>
<p>Verwenden tust du das so:</p>
<pre><code class="language-cpp">unsigned char a = 10;
unsigned char b = 20;
unsigned char c = 30;
unsigned int d = CharToUInt&lt; 32 &gt;::Convert( a, b, c );
</code></pre>
<p>Und das ganze jetzt bitte nicht zu ernst nehmen! <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="😉"
    /> *hust*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1208893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1208893</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Fri, 12 Jan 2007 17:29:50 GMT</pubDate></item><item><title><![CDATA[Reply to Advanced ByteToInt on Sun, 09 Jun 2013 18:21:45 GMT]]></title><description><![CDATA[<p>Ich habe auch immer wieder das Bedürfnis gehabt, meinem Rechner &quot;auf die Finger&quot; zu schauen...(oder viel mehr dem Compiler) <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="😉"
    /> ... und habe einige Lösungen ausprobiert:</p>
<p>1.) das &quot;Modulo-Vervahren&quot;:<br />
Es funktioniert allerdings nur bei Ganzzahlen-Typen (int, long, länger, ...)<br />
Das Prinzip beruht darauf, daß bei Division durch 2 nur ein Rest (Modulo) bleibt, wenn das niederwertigste Bit =1 ist.<br />
Funktion IntToBin:</p>
<pre><code>String bin;
long eingabe=25;
...
while(eingabe&gt;0)
   {
   if(eingabe%2==0)
      bin+=&quot;0&quot;;
   else
      bin+=&quot;1&quot;;
   eingabe/=2;
   }
bin=strrev(bin.c_str());
</code></pre>
<p>2.) Das Shift-Verfahren:<br />
Wie Akari schon andeutete, läßt sich die Position, an der gelesen wird auch durch Shiften ermitteln:</p>
<pre><code>//Parameter:
// str: char-String für's Ergebnis
//      char str[9];  so sollte 'str' definiert sein (...)
// bin: enthält das zu wandelnde Zeichen.

char *bintostr(char *str,char bin)
{
    for (int i=0; i&lt;8; i++)
        if ((bin|(~(1&lt;&lt;(7-i))))==(-1))
            str[i]='1';
          else
            str[i]='0';
    str[8]='\0';
    return str;
}
</code></pre>
<p>3.) Binär-Logik:<br />
Ich hatte das Ziel ganze Klassen (wenn's sein muß) abbilden zu können, daher benötigte ich etwas *wirklich* generisches, daß nicht auf einen Typ beschränkt ist.<br />
Außerdem durfte es intern keine Variable benötigen, die genauso groß wie der zu wandelnde Speicherbereich (!!) ist, daher rastert meine Lösung den gesamten Speicherblock Byteweise ab.</p>
<p>Das Verfahren ist einfach:</p>
<p>01010010 . . (beliebige Quell-Daten)<br />
00000100 &amp; . Es soll an 3. Stelle gelesen weden<br />
00000000 . . Ergebnis: false.</p>
<p>Gegenprobe:<br />
01010010 . . (beliebige Quell-Daten)<br />
00000010 &amp; . Es soll an 2. Stelle gelesen weden<br />
00000010 . . Ergebnis: true.</p>
<p>Man kann aber auch [ Data | ~(2 hoch Stelle) ] rechnen ...</p>
<p>Als Funktions-Template sieht das dann so aus:</p>
<pre><code>template &lt;typename T&gt; UnicodeString ToBin (T *Quelle ){
	UnicodeString str;
	if(Quelle){
		for(char* ende = reinterpret_cast&lt;char*&gt;(Quelle)+sizeof(T)-1;Quelle &lt;= ende; ende--){
			str+=((*ende)&amp; 128)?'1':'0';
			str+=((*ende)&amp; 64)?'1':'0';
			str+=((*ende)&amp; 32)?'1':'0';
			str+=((*ende)&amp; 16)?'1':'0';
			str+='.';
 			str+=((*ende)&amp; 8)?'1':'0';
 			str+=((*ende)&amp; 4)?'1':'0';
			str+=((*ende)&amp; 2)?'1':'0';
			str+=((*ende)&amp; 1)?'1':'0';
			str+=' ';
		}
	}
	return str;
}

// Bsp.:
void main(void){

        unsigned __int64 test_1=3141592653589793238;
        unsigned __int32 test_2=3141592653589793238;
        unsigned __int16 test_3=3141592653589793238;
        TmyClass *test_4 = new TmyClass(&quot;Lorem Ipsum&quot;);

        ShowMessage(&quot;Test: Binäre Ausgabe\n\nTest 1\t= &quot;+ToBin(&amp;test_1)
                +&quot;\nTest 2\t= &quot;+ToBin(&amp;test_2)
                +&quot;\nTest 3\t= &quot;+ToBin(&amp;test_3)
                +&quot;\nTest 4\t= &quot;+ToBin( test_4)); // test_4 ohne '&amp;' - es ist ja schon ein Zeiger

        delete test_4;
}
</code></pre>
<p>Und weil der Mensch nie glücklich ist, habe ich noch eine zweite Version,<br />
mit der man beliebige Speicherbereiche darstellen kann; 'Quelle' gibt hier nur den Bereichsbeginn an:</p>
<pre><code>template &lt;typename T&gt; UnicodeString ToBin (T *Quelle, size_t len){
	 UnicodeString str;
 	if(Quelle){
		for(char* ende = reinterpret_cast&lt;char*&gt;(Quelle)+len-1;Quelle &lt;= ende; ende--){
			str+=((*ende)&amp; 128)?'1':'0';
			str+=((*ende)&amp; 64)?'1':'0';
			str+=((*ende)&amp; 32)?'1':'0';
			str+=((*ende)&amp; 16)?'1':'0';
			str+='.';
			str+=((*ende)&amp; 8)?'1':'0';
 			str+=((*ende)&amp; 4)?'1':'0';
 			str+=((*ende)&amp; 2)?'1':'0';
 			str+=((*ende)&amp; 1)?'1':'0';
 			str+=' ';
		 }
        }
	return str;
}

// Bsp.:
void main(void){

        TmyClass *test_1 = new TmyClass(&quot;Lorem Ipsum&quot;);

        ShowMessage(&quot;Test: Binäre Ausgabe\n\nTest 1\t= &quot;+ToBin( test_1, sizeof(TmyClass))
                +&quot;\nTest 2\t= &quot;+ToBin( test_1, 50)); // was immer auch dabei herauskommen mag ;)

        delete test_1;
}
</code></pre>
<p>Formatierung: rechts steht das niederwertigste Bit; die Bytes durch ein Leerzeichen, und die Nibbles durch ein Punkt getrennt (Sieht Hexeditor-mäßig aus, ist aber Geschmackssache).</p>
<p>Der Speicherbereich, auf den 'Quelle' zeigt, wird Byteweise abgelesen.<br />
In der ersten Version wird als Längeninformation die Typengröße ( sizeof(T) ) verwendet, in der Zweiten stellt 'Quelle' nur die Startadresse dar und 'len' gibt die Größe des zu lesenden Bereiches an - damit ließen sich dann auch beliebige Speicherausschnitte ausgeben.</p>
<p>--&gt; Das ist Borlad-C++; UnicodeString kann natürlich durch einen anderen Typ ersetzt werden.<br />
--&gt; Mit der Aufzählung der Stellenweisen Auswertung wollte ich mir eine weitere Schleife mit einer weiteren Variable sparen ... Also &quot;Auslagerung von Rechenzeit auf Programierzeit&quot;, oder so in der Art. Mit &quot;Register-Aritmetik&quot; ginge das zwar noch besser, aber ich spreche leider kein Assembler...</p>
<p>So, jetzt sollten die meisten Anwendungen doch Abgefrühstückt sein, oder?</p>
<p>Viel spaß damit!</p>
<p>Und wie immer: Wer einen Fehler findet, darf ihn behalten! <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/2329695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2329695</guid><dc:creator><![CDATA[BinärWichel]]></dc:creator><pubDate>Sun, 09 Jun 2013 18:21:45 GMT</pubDate></item></channel></rss>