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 so01100101 (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,