2010-07-22 6 views
3

У меня есть структура, которая содержит целое число и char .. как я могу получить доступ к последним 2 байтам моего int ??доступ к последним 2 байтам целого числа

+0

Это в C/C++? –

+4

Какой язык? Подумайте о мечении лучше. – spinon

+1

Теги @дарина не обязательно соответствуют языкам. Хотя знание большего контекста того, что anajo пытается сделать, было бы полезно. – corsiKa

ответ

2

Предположим, вы используете C/C++, у вас есть что-то вроде:

struct { 
    int myInt; 
    char myChar; 
} myStruct; 

и хотите:

lastTwoBytesOfInt = myStruct.myInt & 0x0000FFFF; 

Посмотрев на Wikipedia может помочь вам понять, битовые операции, если вы не» они еще не знают их.

Кроме того, вы можете взглянуть на Endianness, потому что «последние» байты целого числа являются несколько неоднозначным термином.

10

Термин «последний байт» в целочисленном виде не ясен. Есть две вещи, о которых вы могли подумать:

  • Самый/наименее significant bytes.
  • Последние байты, когда целое число кодируется либо в маленькой, либо в большой форме endian. Endianness часто называют байтовым порядком.

В первом случае наименее значимые байты могут быть доступны на большинстве языков, используя (x & 0xffff).

Во втором случае вам нужно будет проверить, какой порядок байтов вам нужен. Например, если вы используете сетевой байтовый порядок, последний байт является наименее значимым байтом. В других случаях это может быть самый старший байт, который является последним байтом.

+1

Ух, проигнорируйте мой предыдущий комментарий, это конец дня, и мой мозг устал ... –

5
int i = // ?? get your int somehow 
int lastTwoBytes = i & 0x0000FFFF; 
int firstTwoBytes = (i >> 16) & 0x0000FFFF; // maybe you really want the first two? 
4

Используя объединение, как это должно позволить вам получить в отдельных байтах целого:

union { 
    int   i; 
    unsigned char bytes[sizeof(int)]; 
} int_bytes; 

точно, сколько байтов составляют целое число зависит от реализации.

+0

нет, вы не должны использовать союзы так, как вы подразумеваете. –

+0

@ Cirno- В каком смысле? Я не вызываю неопределенное поведение. Это по существу не отличается от объявления 'int i; char * ptr = (char *) & i; 'и используя' ptr', как массив для последовательного доступа к байтам. Это общий метод для сброса байтов блока данных в отладочном коде. – bta

+0

В C99 «значение члена объединения, отличного от последнего, сохраненного в», является «неуказанным поведением» (J.1). Unspecified, не undefined - так что это не ошибка, но реализация может выбрать, что ей нравится. Итак, технически не переносимый, но вам придется странно внедрять союзы для этого * not *, чтобы дать вам байты представления 'i'. –

1

Вот еще один способ получить доступ к верхнему и нижнему 16-бит (предполагается, что короткий 16-бит на вашей системе):

unsigned int x = 0x12345678; 
cout << hex << ((unsigned short*)&x)[0] << endl; // prints 5678 
cout << hex << ((unsigned short*)&x)[1] << endl; // prints 1234 

Обратите внимание, что результат зависит от байт вашей системы. http://en.wikipedia.org/wiki/Endianness

0

В окнах вы можете использовать HiWord()/LoWord() для доступа к первому или последнему 2 байтам.

Смежные вопросы