мог получить n-й байт целого числа - PullRequest
33 голосов
/ 17 октября 2011

Я знаю, что вы можете получить первый байт, используя

int x = number & ((1<<8)-1);

или

int x = number & 0xFF;

Но я не знаю, как получить n-й байт целого числа. Например, 1234 - это 00000000 00000000 00000100 11010010 как 32-разрядное целое число Как я могу получить все эти байты? первый будет 210, второй будет 4, а последние два будут 0.

Ответы [ 4 ]

69 голосов
/ 17 октября 2011
int x = (number >> (8*n)) & 0xff;

где n равно 0 для первого байта, 1 для второго байта и т. Д.

13 голосов
/ 17 октября 2011

Для (n + 1) -го байта в любом порядке, в котором они появляются в памяти (что также является наименее-значимым для машин с прямым порядком байтов, таких как x86):

int x = ((unsigned char *)(&number))[n];

Для (n + 1) -й байт от младшего к старшему на машинах с прямым порядком байтов:

int x = ((unsigned char *)(&number))[sizeof(int) - 1 - n];

Для (n + 1)-го байта от младшего к старшему (с любым порядком байтов):

int x = ((unsigned int)number >> (n << 3)) & 0xff;

Конечно, все они предполагают, что n <<code>sizeof(int), и что number является int.

2 голосов
/ 17 октября 2011

int nth = (number >> (n * 8)) & 0xFF;

Перенести его в младший байт и взять его "знакомым" образом.

0 голосов
/ 14 июня 2019

Если вы хотите получить байт, лучшим решением будет:

byte x = (byte)(number >> (8 * n));

Таким образом, вы возвращаете и работаете с байтом вместо целого, поэтому мы используем меньше памяти, и нам не нужно делать двоичный файл и операцию & 0xff, чтобы просто замаскировать результат до байта , Я также видел, что человек, задающий вопрос, использовал int в своем примере, но это не делает его правильным.

Я знаю, что этот вопрос задавали очень давно, но я столкнулся с этой проблемой, и я думаю, что это лучшее решение, независимо от того.

...