C / C ++ читает байт из шестнадцатеричного ввода из стандартного ввода - PullRequest
1 голос
/ 04 февраля 2009

Не могу точно найти способ сделать следующее в C / C ++.

Ввод: шестнадцатеричные значения, например: ffffffffff ...

Я попробовал следующий код для чтения ввода:

uint16_t twoBytes;
scanf("%x",&twoBytes);

Это нормально работает и все, но как мне разделить 2 байта на значения 1 байта uint8_t (или, возможно, даже прочитать только первый байт). Хотел бы прочитать первый байт из входных данных и сохранить его в байтовой матрице в позиции выбора.

uint8_t matrix[50][50]

Поскольку я не очень опытен в форматировании / чтении с ввода в C / C ++ (и до сих пор использовал только scanf), любые другие идеи о том, как сделать это легко (и быстро, если это произойдет), очень приветствуются.

Редактирование: нашел еще лучший метод, используя функцию fread, поскольку она позволяет указать, сколько байтов следует читать из потока (в данном случае stdin) и сохранять в переменную / массив.

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

Параметры

ptr - указатель на блок памяти с минимальным размером (размер * количество) байтов.

size - Размер в байтах каждого элемента для чтения.

count - Количество элементов, каждый из которых имеет размер в байтах.

stream - Указатель на объект FILE, который определяет входной поток.

cplusplus ref

Ответы [ 3 ]

2 голосов
/ 04 февраля 2009

%x читает unsigned int, а не uint16_t (хотя они могут быть одинаковыми на вашей конкретной платформе).

Чтобы прочитать только один байт, попробуйте это:

uint32_t byteTmp;
scanf("%2x", &byteTmp);
uint8_t byte = byteTmp;

Это читает unsigned int, но останавливается после чтения двух символов (два шестнадцатеричных символа равны восьми битам или одному байту).

0 голосов
/ 04 февраля 2009

Пара мыслей:

1) читать как символы и конвертировать вручную - больно

2) Если вы знаете, что существует кратное 4 гекситам, вы можете просто прочитать два байта, а затем преобразовать их в однобайтовые значения с high = twobytes << 8; низкий = два байта & FF; </p>

3)% 2x

0 голосов
/ 04 февраля 2009

Вы должны разделить переменную следующим образом:

uint8_t LowerByte=twoBytes & 256;
uint8_t HigherByte=twoBytes >> 8;
...