Ich weiß, dass Sie das erste Byte erhalten können, indem Sie verwenden
int x = number & ((1<<8)-1);
oder
int x = number & 0xFF;
Aber ich weiß nicht, wie ich das n-te Byte einer Ganzzahl bekomme. Zum Beispiel ist 1234 00000000 00000000 00000100 11010010 als 32-Bit-Ganzzahl. Wie bekomme ich all diese Bytes? Der erste wäre 210, der zweite wäre 4 und die letzten beiden wären 0.
Sie verwenden bereits den Bitverschiebungsoperator << in deinem beispiel. Wie könnten Sie den Shift-Operator verwenden, um verschiedene Bits aus Ihrer Zahl herauszuholen?
– Greg Hewgill
16. Oktober 2011 um 21:24 Uhr
Probieren Sie den anderen Bitverschiebungsoperator aus.
– Marcelo Cantos
16. Oktober 2011 um 21:26 Uhr
Denken Sie daran, dass das „erste Byte“ – wie Sie es hier verwendet haben – möglicherweise nicht das erste Byte im Speicher ist. Ihr Beispiel, 1234, kann sehr leicht sein 11010010 an der niedrigsten Adresse und 00000000 an der höchsten Adresse.
– Thanatos
16. Oktober 2011 um 22:01 Uhr
Vaughn Cato
int x = (number >> (8*n)) & 0xff;
wobei n 0 für das erste Byte, 1 für das zweite Byte usw. ist.
Bitte Klammern verwenden! Ich kann nie mitbestimmen, ob >> oder * hat einen höheren Vorrang.
– Greg Hewgill
16. Oktober 2011 um 21:25 Uhr
Warum verursacht dies keine Verrücktheit aufgrund einer arithmetischen Rechtsverschiebung? Ich weiß, dass es nicht so ist, ich verstehe nur nicht warum.
– Brian Peterson
11. September 2019 um 1:48 Uhr
@BrianPeterson Die Zahl wird nach rechts verschoben, sodass sich das gewünschte Byte ganz rechts befindet, und dann mit & 0xff maskiert, wodurch an jeder Stelle, an der beide Zahlen Einsen haben, eine Eins ausgegeben wird. Zum Beispiel n = 0000 0000 1011 0101 0xff = 0000 0000 0000 1111 n & 0xff = 0000 0000 0000 0101
– FlexEast
26. Juni um 14:42 Uhr
Dimitri
Für das (n+1)-te Byte in beliebiger Reihenfolge, in der sie im Speicher erscheinen (was auf Little-Endian-Maschinen wie x86 auch von der geringsten bis zur höchsten Bedeutung ist):
int x = ((unsigned char *)(&number))[n];
Für das (n+1)-te Byte vom niederwertigsten zum höchstwertigen auf Big-Endian-Maschinen:
int x = ((unsigned char *)(&number))[sizeof(int) - 1 - n];
Für das (n+1)-te Byte vom niederwertigsten zum höchstwertigen (beliebiges Endian):
int x = ((unsigned int)number >> (n << 3)) & 0xff;
Davon gehen natürlich alle aus n < sizeof(int)und das number ist ein int.
Wenn wir ein Array von int haben, wie ändert sich die Antwort? Ich meine, wie kann ich den Wert des n-ten Bytes vom Anfang eines int-Arrays erhalten?
– HoseinGhanbari
24. Dezember 2017 um 4:49 Uhr
@HoseinGhanbari Gleicher Weg, aber finde das (n % sizeof(int))-tes Byte der (n / sizeof(int))-tes Array-Element.
– Dimitri
24. Dezember 2017 um 6:36 Uhr
int nth = (number >> (n * 8)) & 0xFF;
Tragen Sie es in das unterste Byte und nehmen Sie es auf die “bekannte” Weise.
Wenn Sie ein Byte wollen, wäre die bessere Lösung nicht:
byte x = (byte)(number >> (8 * n));
Auf diese Weise geben Sie ein Byte anstelle eines Int zurück und verarbeiten es, sodass wir weniger Speicher verwenden und die Binärdatei und die Operation nicht ausführen müssen & 0xff nur um das Ergebnis auf ein Byte zu maskieren. Ich habe auch gesehen, dass die Person, die die Frage gestellt hat, in ihrem Beispiel ein int verwendet hat, aber das macht es nicht richtig.
Ich weiß, dass diese Frage vor langer Zeit gestellt wurde, aber ich bin gerade auf dieses Problem gestoßen, und ich denke, dass dies trotzdem eine bessere Lösung ist.
14040900cookie-checkc n-tes Byte der Ganzzahl erhaltenyes
Sie verwenden bereits den Bitverschiebungsoperator
<<
in deinem beispiel. Wie könnten Sie den Shift-Operator verwenden, um verschiedene Bits aus Ihrer Zahl herauszuholen?– Greg Hewgill
16. Oktober 2011 um 21:24 Uhr
Probieren Sie den anderen Bitverschiebungsoperator aus.
– Marcelo Cantos
16. Oktober 2011 um 21:26 Uhr
Denken Sie daran, dass das „erste Byte“ – wie Sie es hier verwendet haben – möglicherweise nicht das erste Byte im Speicher ist. Ihr Beispiel, 1234, kann sehr leicht sein
11010010
an der niedrigsten Adresse und00000000
an der höchsten Adresse.– Thanatos
16. Oktober 2011 um 22:01 Uhr