<?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[Problem mit casts]]></title><description><![CDATA[<p>Ich suche eine schlaue Lösung aus einem char-Array mit folgender (simplifizierter) Struktur Daten auszulesen:</p>
<p>[dType,dEntry, dType,dEntry, dType,dEntry, ...]</p>
<p>dType ist immer ein signed char<br />
dEntry ist entweder ein, zwei oder vier Byte lang</p>
<p>Abhängig von dType soll das folgende dEntry als</p>
<p>-1 = 8 bit char<br />
1 = 8 bit byte<br />
2 = 16bit int<br />
4 = 32bit float</p>
<p>interpretiert werden. Was ich bisher mache ist folgendes:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using std::cout;
using std::endl;

    const int arr=40;
    char datei[arr];

    // demodata
    void dummyDatei()
    {
        union bit16 {
            unsigned char a,b;
            unsigned short int k;
        } in;

        in.k = 12345;

        union bit32 {
            unsigned char a,b,c,d;
            float k;
        } fl;

        fl.k = 12345.12345;

        int i = -1;

        // chars
        datei[++i]= -1;    datei[++i]= 'T';
        datei[++i]= -1;    datei[++i]= 'e';
        datei[++i]= -1;    datei[++i]= 's';
        datei[++i]= -1;    datei[++i]= 't';

        // 8 bit byte
        datei[++i]= 1;    datei[++i]= 0x1;
        datei[++i]= 1;    datei[++i]= 0x2;
        datei[++i]= 1;    datei[++i]= 0x3;
        datei[++i]= 1;    datei[++i]= 0x4;

        // 16 bit byte
        datei[++i]= 2;    datei[++i]= 0xAA;    datei[++i]= 0xAA;

        // 32 bit float
        datei[++i]= 4;    datei[++i]= 0x01;    datei[++i]= 0x01;    datei[++i]= 0x01;    datei[++i]= 0xBB;

        // more chars
        datei[++i]= -1;    datei[++i]= 'T';
        datei[++i]= -1;    datei[++i]= 'e';
        datei[++i]= -1;    datei[++i]= 's';
        datei[++i]= -1;    datei[++i]= 't';

        // rest to 0x00
        while (i &lt; arr)
            datei[++i]= 0x00;
    }

    // convert methods
    char toChar(char * pos) {return *pos;}
    unsigned short int toByte(char * pos) {return (unsigned short int)(*pos);}
    unsigned short int toInt(char * pos) {return *(unsigned short int*)(pos);}
    float toFloat(char * pos) {return *(float*)(pos);}

    // parser
    int parseOne(char * pos)
    {
        int type = (int)*pos;
        ++pos;        

        switch (type)
        {
        case -1:
            cout &lt;&lt; &quot;char:  '&quot; &lt;&lt; toChar(pos) &lt;&lt; &quot;'&quot;;
            break;
        case 1:
            cout &lt;&lt; &quot; 8bit: '&quot; &lt;&lt; toByte(pos) &lt;&lt; &quot;'&quot;;
            break;
        case 2:
            cout &lt;&lt; &quot;16bit: '&quot; &lt;&lt;  toInt(pos) &lt;&lt; &quot;'&quot;;
            break;
        case 4:
            cout &lt;&lt; &quot;float: '&quot; &lt;&lt; toFloat(pos) &lt;&lt; &quot;'&quot;;
            break;
        }
        if (type) cout &lt;&lt; endl;
        else return 0;

        return abs(type)+1;
    }

// main
int main(int , char )
{
    dummyDatei();
    cout &lt;&lt; &quot;THE ARRAY:&quot; &lt;&lt; endl &lt;&lt; datei &lt;&lt; endl &lt;&lt; endl;

    cout &lt;&lt; &quot;PARSED:&quot; &lt;&lt; endl;

    char * datPoint = datei;

    int inc=1;
    while (inc)
    {
        inc = parseOne(datPoint);
        datPoint += inc;
    }
}
</code></pre>
<p>Ausgabe:</p>
<blockquote>
<p>Starte /test...<br />
THE ARRAY:<br />
�T�e�s�t����T�e�s�t</p>
<p>PARSED:<br />
char: 'T'<br />
char: 'e'<br />
char: 's'<br />
char: 't'<br />
8bit: '1'<br />
8bit: '2'<br />
8bit: '3'<br />
8bit: '4'<br />
16bit: '43690'<br />
float: '-0.00196844'<br />
char: 'T'<br />
char: 'e'<br />
char: 's'<br />
char: 't'</p>
<p>/test beendet, Rückgabewert 0</p>
</blockquote>
<p>Was ich haben möchte ist eine Funktion die in etwa so arbeitet:</p>
<pre><code class="language-cpp">rück transform(short int dataType, char * pos) 
{...}
</code></pre>
<p>also alle mit _dem_ _selben_ Aufruf.</p>
<p>Geht sowas, wenn ja wie?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262420/problem-mit-casts</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 13:02:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262420.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Mar 2010 17:57:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit casts on Fri, 05 Mar 2010 17:57:06 GMT]]></title><description><![CDATA[<p>Ich suche eine schlaue Lösung aus einem char-Array mit folgender (simplifizierter) Struktur Daten auszulesen:</p>
<p>[dType,dEntry, dType,dEntry, dType,dEntry, ...]</p>
<p>dType ist immer ein signed char<br />
dEntry ist entweder ein, zwei oder vier Byte lang</p>
<p>Abhängig von dType soll das folgende dEntry als</p>
<p>-1 = 8 bit char<br />
1 = 8 bit byte<br />
2 = 16bit int<br />
4 = 32bit float</p>
<p>interpretiert werden. Was ich bisher mache ist folgendes:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using std::cout;
using std::endl;

    const int arr=40;
    char datei[arr];

    // demodata
    void dummyDatei()
    {
        union bit16 {
            unsigned char a,b;
            unsigned short int k;
        } in;

        in.k = 12345;

        union bit32 {
            unsigned char a,b,c,d;
            float k;
        } fl;

        fl.k = 12345.12345;

        int i = -1;

        // chars
        datei[++i]= -1;    datei[++i]= 'T';
        datei[++i]= -1;    datei[++i]= 'e';
        datei[++i]= -1;    datei[++i]= 's';
        datei[++i]= -1;    datei[++i]= 't';

        // 8 bit byte
        datei[++i]= 1;    datei[++i]= 0x1;
        datei[++i]= 1;    datei[++i]= 0x2;
        datei[++i]= 1;    datei[++i]= 0x3;
        datei[++i]= 1;    datei[++i]= 0x4;

        // 16 bit byte
        datei[++i]= 2;    datei[++i]= 0xAA;    datei[++i]= 0xAA;

        // 32 bit float
        datei[++i]= 4;    datei[++i]= 0x01;    datei[++i]= 0x01;    datei[++i]= 0x01;    datei[++i]= 0xBB;

        // more chars
        datei[++i]= -1;    datei[++i]= 'T';
        datei[++i]= -1;    datei[++i]= 'e';
        datei[++i]= -1;    datei[++i]= 's';
        datei[++i]= -1;    datei[++i]= 't';

        // rest to 0x00
        while (i &lt; arr)
            datei[++i]= 0x00;
    }

    // convert methods
    char toChar(char * pos) {return *pos;}
    unsigned short int toByte(char * pos) {return (unsigned short int)(*pos);}
    unsigned short int toInt(char * pos) {return *(unsigned short int*)(pos);}
    float toFloat(char * pos) {return *(float*)(pos);}

    // parser
    int parseOne(char * pos)
    {
        int type = (int)*pos;
        ++pos;        

        switch (type)
        {
        case -1:
            cout &lt;&lt; &quot;char:  '&quot; &lt;&lt; toChar(pos) &lt;&lt; &quot;'&quot;;
            break;
        case 1:
            cout &lt;&lt; &quot; 8bit: '&quot; &lt;&lt; toByte(pos) &lt;&lt; &quot;'&quot;;
            break;
        case 2:
            cout &lt;&lt; &quot;16bit: '&quot; &lt;&lt;  toInt(pos) &lt;&lt; &quot;'&quot;;
            break;
        case 4:
            cout &lt;&lt; &quot;float: '&quot; &lt;&lt; toFloat(pos) &lt;&lt; &quot;'&quot;;
            break;
        }
        if (type) cout &lt;&lt; endl;
        else return 0;

        return abs(type)+1;
    }

// main
int main(int , char )
{
    dummyDatei();
    cout &lt;&lt; &quot;THE ARRAY:&quot; &lt;&lt; endl &lt;&lt; datei &lt;&lt; endl &lt;&lt; endl;

    cout &lt;&lt; &quot;PARSED:&quot; &lt;&lt; endl;

    char * datPoint = datei;

    int inc=1;
    while (inc)
    {
        inc = parseOne(datPoint);
        datPoint += inc;
    }
}
</code></pre>
<p>Ausgabe:</p>
<blockquote>
<p>Starte /test...<br />
THE ARRAY:<br />
�T�e�s�t����T�e�s�t</p>
<p>PARSED:<br />
char: 'T'<br />
char: 'e'<br />
char: 's'<br />
char: 't'<br />
8bit: '1'<br />
8bit: '2'<br />
8bit: '3'<br />
8bit: '4'<br />
16bit: '43690'<br />
float: '-0.00196844'<br />
char: 'T'<br />
char: 'e'<br />
char: 's'<br />
char: 't'</p>
<p>/test beendet, Rückgabewert 0</p>
</blockquote>
<p>Was ich haben möchte ist eine Funktion die in etwa so arbeitet:</p>
<pre><code class="language-cpp">rück transform(short int dataType, char * pos) 
{...}
</code></pre>
<p>also alle mit _dem_ _selben_ Aufruf.</p>
<p>Geht sowas, wenn ja wie?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1864864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1864864</guid><dc:creator><![CDATA[padreigh]]></dc:creator><pubDate>Fri, 05 Mar 2010 17:57:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit casts on Tue, 09 Mar 2010 06:00:07 GMT]]></title><description><![CDATA[<p>Hab mir deine Funktion nicht im Detail angesehen, aber grundsätzlich kannst du sowas z.B. mit Templates realisieren. Überladung wäre auch noch eine Möglichkeit (aber eventuell eine, die mehr Tipparbeit und redundanten Code bedeutet).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866344</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Tue, 09 Mar 2010 06:00:07 GMT</pubDate></item></channel></rss>