Frage

Ich habe einen besonderen unsigned long (32 Bit) und ich brauche die endianness davon bitweise zu konvertieren - mein lang mehrere Dinge alle zusammen in ein Stück von binären smooshed repräsentiert

.

Wie kann ich es tun?

War es hilfreich?

Lösung

Endianness ist ein Wort-Level-Konzept, bei dem die Bytes entweder höchstwertigen Byte zuerst gespeichert werden (Big Endian) oder am wenigsten signifikante Byte zuerst (Little Endian). Daten über ein Netzwerk übertragen ist in der Regel Big-Endian (so genannte Netzwerk-Byte-Reihenfolge). Gespeicherten Daten im Speicher auf einer Maschine können in beliebiger Reihenfolge sein, mit Little-Endian ist die häufigste der Prävalenz der Intel x86-Architektur gegeben. Auch wenn die meisten Computerarchitekturen Big-Endian sind, ist die x86 so allgegenwärtig, dass Sie am meisten Little-Endian-Daten im Speicher zu sehen.

Wie auch immer, der Punkt, dass alle ist, dass endianness ein sehr spezifisches Konzept, das nur auf Byte-Ebene gilt, nicht die Bit-Ebene. Wenn ntohs(), ntohl(), htons() und htonl() nicht tun, was wollen Sie dann, was Sie zu tun haben nicht per se endianness.

Wenn Sie so die einzelnen Bits des unsigned long oder irgendetwas anderes tun kompliziert rückgängig zu machen, bitte weitere Informationen veröffentlichen, was genau Sie tun müssen.

Andere Tipps

Achten Sie darauf, die Bedeutung von ‚Endian‘ zu verstehen. Er bezieht sich auf die Reihenfolge der Bytes innerhalb der Daten, nicht-Bits innerhalb des Bytes. Sie können nur eine Funktion wie htonl oder ntohl verwenden müssen, um Ihr d-Wort zu konvertieren.

Wenn Sie wirklich die Reihenfolge aller Bits in der 32b-Datentyp umkehren wollen, könnten Sie einen iterativen Algorithmus schreiben zu maskieren und verschieben jedes Bit in die entsprechende Position reflektiert wird.

Eine einfache Endianess Konvertierungsfunktion für einen unsigned long-Wert wie folgt aussehen könnte:

typedef union {
  unsigned long u32;
  unsigned char u8 [ 4 ];
} U32_U8;

unsigned long SwapEndian(unsigned long u)
{
   U32_U8 source;
   U32_U8 dest;

   source.u32 = u;
   dest.u8[0] = source.u8[3];
   dest.u8[1] = source.u8[2];
   dest.u8[2] = source.u8[1];
   dest.u8[3] = source.u8[0];

   return dest.u32;
}

die Bitreihenfolge einer ganzen Zahl zu invertieren, können die Bits in einer Richtung verschieben und um die Bits zu dem Ziel in die entgegengesetzte Richtung verschieben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top