| Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme. |
Diskussion: Network Byte Order nach Host Byte Order im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Gute Tag, ich versuche auf einem AVR(Little Endian) DHCP zu implementieren, soweit klappt auch alles, ausser, dass ich es ...
![]() |
| | #1 (permalink) |
| Registriert seit: 25.04.08 ![]() Likes: 1 | Anzeige Gute Tag, ich versuche auf einem AVR(Little Endian) DHCP zu implementieren, soweit klappt auch alles, ausser, dass ich es nicht schaffe die Lease Time die ich vom Server bekommen, von der Network Byte Order zur Host Byte Order zu konvertieren. Die Lease Time ist ein unsigned 32-Bit Wert, vom Server bekomme ich die Lease time in 4-Bytes opt_ptr[0-3], diese sollen nun in einer 32-Bit Variable in Little Endian gespeichert werden. Das wäre wahrscheinlich die Methode wenn die Lease Time bereits in der Host Byte Order vorliegen würde. Code: state.lease_time = (opt_ptr[0]) | (opt_ptr[1] << 8) | (opt_ptr[2] << 16) | (opt_ptr[3] << 24); |
| | |
| | #2 (permalink) |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | Sind htonl / ntohl für die Plattform verfügbar? Byte Order - The GNU C Library ? Ansonsten: Code: (opt_ptr[0]) | (opt_ptr[1] << 8) | (opt_ptr[2] << 16) | (opt_ptr[3] << 24); geändert werden, keineswegs die Bits selbst (außerdem: 8 Bit Zahl um 8 oder mehr Stellen nach links shiften - da kommt 0 heraus Also ganz einfach: wie vertauscht man eigentlich 4 Werte in einem Array? "Klassisch" könnte man das swapping so machen: Code: * Swap bytes in 32 bit value. */
#define __bswap_constant_32(x) \
((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) | \
(((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24)) Allerdings sollte man den Wert "opt_ptr" dann als 32-Bit Value ansehen und nicht als vier 8-bit Werte. Empfehlen würde ich aber trotzdem die entsprechenden Funktionen zu verwenden (htons/ntohl), da hier die Libs z.B das Swapping "intern" über Inline-Assemly erledigen können (was auf vielen Plattformen nur eine einzelne Anweisung braucht - und nicht ~30, wie bei dem "naiven" C-Swapping mit dem Rumgeshifte
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. |
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) |
| Themenstarter Registriert seit: 25.04.08 ![]() Likes: 1 | Danke, also die avr-libc hat kein htonl/ntohl, aber ich hab mir jetzt aus deinem bzw. aus dem glibc Makro folgende Funktion gebaut: Code: uint32_t ntohl(uint32_t x)
{
return ((x & 0xFF000000UL) >> 24) | ((x & 0x00FF0000UL) >> 8) | ((x & 0x0000FF00UL) << 8) | ((x & 0x000000FFUL) << 24);
} |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| SMS- bit, byte? | torsten | Off topic-Zone | 20 | 01.09.10 10:48 |
| Firefox 3.5 Datei nach Download 0 Byte | nookstar | Applikationen | 3 | 02.10.09 14:46 |
| ORDER BY Zahlenwert... | TeeKayo2 | (Web-) Design und webbasierte Sprachen | 4 | 26.07.06 18:05 |
| [Source] Byte Array in VB.NET nach String durchsuchen | ByteWolf | Code Kitchen | 0 | 29.05.05 15:36 |