Как извлечь 2 байта из слова и как сделать слово из 2 байтов (в C)?

Вопрос: Я пытаюсь извлечь два байта из 16-битного слова и сделать 16-битное слово из двух байтов. Это то, что я пробовал (byte = unsigned char, word = unsigned short): Разделить слово grpix на 2 байта: word grpix; // Assume that the value has been initialized byte grpixl = grpix & 0x00FF; byte grpixh = grpix

Вопрос:

Я пытаюсь извлечь два байта из 16-битного слова и сделать 16-битное слово из двух байтов. Это то, что я пробовал (byte = unsigned char, word = unsigned short):

Разделить слово grpix на 2 байта:

word grpix; // Assume that the value has been initialized byte grpixl = grpix & 0x00FF; byte grpixh = grpix & 0xFF00;

Сделать слово grpix из 2 байтов

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;

По какой-то причине мой код работает не так, как ожидалось, и теперь я не уверен, что “расщепление” этого слова неверно, если “создание” слова неправильное или оба… Не могли бы вы дать мне совет?

Лучший ответ:

Вы не сдвигаетесь, когда вы разделяете слово. Поэтому, если grpix равен 0x1234, тогда grpixl получает ожидаемый 0x34 но grpixh заканчивается как 0x1200. Ты должен сказать

byte grpixh = grpix >> 8;

Конечно, вы также игнорируете любые опасения, которые могут возникнуть у вас. Вероятно, вы должны преобразовать свое слово к известному endian (с чем-то вроде htons()), прежде чем пытаться разбить (и сделать обратное преобразование при присоединении).

Ответ №1

Узнайте: http://graphics.stanford.edu/~seander/bithacks.html для выполнения всех операций.

right_byte = short_val & 0xFF; left_byte = ( short_val >> 8 ) & 0xFF short_val = ( ( left_byte & 0xFF ) << 8 ) | ( right_byte & 0xFF );

Я всегда делаю маску & 0xFF, чтобы гарантировать, что у меня нет проблем с знаками.

Ответ №2

Когда вы маскируете старший байт, вам также нужно сдвинуть его на 8 бит, иначе вы просто получите 16-битное число с очищенными нижними восемью битами.

byte grpixh = (grpix & 0xFF00) >> 8

Кроме того, ваша композиция может быть более эффективной, используя or-equals вместо плюсов:

grpix | = grpixh << 8

Ответ №3

Простой код, который я использую для решения этой проблемы:

word=(msb<<8)+lsb;

Оцените статью
Добавить комментарий