c n-tes Byte der Ganzzahl erhalten

Lesezeit: 3 Minuten

Benutzeravatar von Kamran224
Kamran224

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

Benutzeravatar von Vaughn Cato
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

Benutzeravatar von Dmitri
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.

1404090cookie-checkc n-tes Byte der Ganzzahl erhalten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy