bitweise kopieren bei little endian processor



  • Hallo zusammen,

    Ich versuche eine int wert byteweise in einen char array zu kopieren (Mein
    Prozessor arbeitet mit Little Endian bit-folge). Dafuer
    benutze ich:

    int fill_prt(unsigned char* buffer, unsigned int* port_no){
    
        int i ;
        short size = sizeof(unsigned int) ;
        iterator = buffer ;
        unsigned int* temp ;
    
        temp = port_no + size - 1 ; /* falls LE */
    
        if(testByteOrder() == L_ENDIAN){
    
            for(i=0 ; i < size ; i++){
                memcpy(iterator, temp, 1) ;
                temp-- ;              
                fprintf(stdout,"%d \t",*iterator) ; /* debug */ 
                iterator++ ;
            }
        } else { /* big endian */ 
            memcpy(iterator, port_no, size) ;
            iterator += size ;
        }
    return 0 
    }
    

    Durch diese Funktion moechte ich die Little Endian byte order auf Big Endian
    umstellen. Bei LE wuerde man Dezimalwert von 3429 so

    01100101 (101 dezimal) bei niedrigster speicher
    00001101  (13        ) bei                       +1
    00000000   (0        ) bei                       +2 
    00000000  (0         ) bei                        +3
    

    darstellen. was wiederum duch die Funktion oben so umgestellt werden sollte:

    0                iterator (char ptr)
    0                iterator +1 
    13               iterator +2 
    101              iterator +3
    

    Wenn ich die funktion oben debugge, dann kommt nur 101 als richtige
    Wert raus obwohl ich meine, dass die Logik so funktionieren -sollte-.. Aber es
    tut's nicht! Kann jemand irgendeinen Fehler entdecken was zu diesem Ergebnis
    fuehrt?

    Danke im voraus,



  • jsbach schrieb:

    ... moechte ich die Little Endian byte order auf Big Endian
    umstellen.

    int tmp;
    
        __asm mov eax, tmp
        __asm bswap eax
        __asm mov tmp, eax
    

    😉



  • __asm_Fan schrieb:

    int tmp;
        
        __asm mov eax, tmp
        __asm bswap eax
        __asm mov tmp, eax
    

    😉

    Hab das problem so aehnlich geloest: Allerdings nicht tief in Assembler Ebene
    wie in deinem Beispiel ;). Kann man wirklich solche Assembler Anweisungen
    mit gcc kompilieren? Gaebe es tutorial mit lustigen beispiele, den du auch
    kennst? Oder ist deine Umgebung speziell dafuer?

    Gruss,



  • So irgendwie evtl.?

    typedef union
    {
        int convert_value;
        char convert_array[sizeof(int)];
    } convert_helper_union;
    
    int convert_endian(int n)
    {
        convert_helper_union tmp;
        int     count;
        char    swap_tmp;
    
        tmp.convert_value = n;
        for(count = 0; count < (sizeof(int) / 2); ++count)
        {
            swap_tmp = tmp.convert_array[sizeof(int) - count - 1];
            tmp.convert_array[sizeof(int) - count - 1] = tmp.convert_array[count];
            tmp.convert_array[count] = swap_tmp;
        }
        return tmp.convert_value;
    }
    


  • Tachyon schrieb:

    So irgendwie evtl.?

    bestimmt nicht. viel zu viel code. eher so:

    unsigned int convert_endian (unsigned int n)
    {
      return n<<24 | (n & 0xff0000)>>8 | (n & 0xff00)<<8 | n>>24;
    }
    

    🙂



  • Hallo *freak,

    conversion-freak schrieb:

    viel zu viel code. eher so:

    unsigned int convert_endian (unsigned int n)
    {
      return n<<24 | (n & 0xff0000)>>8 | (n & 0xff00)<<8 | n>>24;
    }
    

    🙂

    sieht jut aus.. das probiere ich demnaechst aus..

    Gruss,


Anmelden zum Antworten