Wie zum extrahieren von 2 bytes aus einem Wort, und wie ein Wort von 2 Byte (in C)?
Ich versuche zu extrahieren, die beiden bytes eines 16-bit-Wort, und eine 16-bit-Wort aus zwei bytes. Dies ist, was ich versucht habe (byte = unsigned char, word = unsigned short):
Split grpix Wort in 2 Byte:
word grpix; //Assume that the value has been initialized
byte grpixl = grpix & 0x00FF;
byte grpixh = grpix & 0xFF00;
Machen grpix Wort aus 2 bytes
byte grpixh; //Assume that the value has been initialized
byte grpixl; //Assume that the value has been initialized
word grpix = grpixh;
grpix <<= 8;
grpix += grpixl;
Aus irgendeinem Grund, mein code funktioniert nicht wie erwartet, und ich bin mir jetzt nicht sicher, ob die "Teilung" das Wort ist falsch, wenn die "macht" des Wortes ist falsch, oder beides... Könnten Sie mir einige Ratschläge geben?
Sind Sie sicher, dass Sie auf einer big-endian-Maschine? Intel-chips sind little-endian.
Big-endian-oder kleinen-endian?
Gut, mein notebook hat ein Intel-chip.
Diese StackOverflow-Eintrag kann helfen: stackoverflow.com/questions/14950366/...
Big-endian-oder kleinen-endian?
Gut, mein notebook hat ein Intel-chip.
Diese StackOverflow-Eintrag kann helfen: stackoverflow.com/questions/14950366/...
InformationsquelleAutor Fernando Aires Castello | 2013-02-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bist du nicht verschieben Sie, wenn Sie teilen das Wort. Also, wenn
grpix
ist0x1234
, danngrpixl
bekommt die erwartete0x34
abergrpixh
endet0x1200
. Sie sollten sagen,Natürlich, du bist auch ohne jeglichen endianness Bedenken, die vorhanden sein können. Sie sollten wahrscheinlich konvertieren Sie Ihre word zu einem bekannten endian (mit so etwas wie
htons()
), bevor Sie versuchen zu splitten (und das tun die umgekehrte Konvertierung beim Eintritt).byte grpixh = (grpix >> 8) & 0x00FF;
und jetzt funktioniert es 🙂InformationsquelleAutor Lily Ballard
Kennen zu lernen: http://graphics.stanford.edu/~seander/bithacks.html für dabei alle Arten von Operationen.
Mach ich immer ein &0xFF Maske zu versichern, ich habe keine Anzeichen von Problemen.
InformationsquelleAutor Gilbert
Wenn Sie Maske aus dem high-byte, müssen Sie auch nach unten verschoben um 8 bits, da Sie gerade am Ende mit einem 16-bit-Zahl mit der unteren acht bits gelöscht.
byte grpixh = (grpix & 0xFF00) >> 8
Auch Ihre Zusammensetzung kann es effizienter sein, die durch die Nutzung oder gleich statt der plus-gleich:
grpix |= grpixh << 8
ja, es ist sinnlos, aber ein bisschen nützlich visualisng und es zu verstehen ...
InformationsquelleAutor Ian McMahon
Einfachen code, den ich verwenden, um dieses Problem zu lösen, ist:
InformationsquelleAutor mohammad