C /C ++ считывает байт из шестнадцатеричного ввода из stdin
Вопрос
Не могу точно найти способ, как сделать следующее на C / C ++.
Входные данные :например, шестнадцатеричные значения:фффффффффффф...
Я попробовал следующий код, чтобы прочитать входные данные :
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) байт.
size - Размер в байтах каждого считываемого элемента.
count - количество элементов, каждый из которых имеет размер в байтах.
stream - указатель на ФАЙЛОВЫЙ объект, который указывает входной поток.
Решение
%x
читает unsigned int
, а не uint16_t
(думал, что они могут быть одинаковыми на вашей конкретной платформе).
Чтобы прочитать только один байт, попробуйте следующее:
uint32_t byteTmp;
scanf("%2x", &byteTmp);
uint8_t byte = byteTmp;
Это означает, что unsigned int
, но останавливается после считывания двух символов (два шестнадцатеричных символа равны восьми битам, или одному байту).
Другие советы
Вы должны быть в состоянии разделить переменную следующим образом:
uint8_t LowerByte=twoBytes & 256;
uint8_t HigherByte=twoBytes >> 8;
Пара мыслей:
1) прочитать его как символы и преобразовать вручную - болезненно
2) Если вы знаете, что существует число, кратное 4 шестнадцатеричным разрядам, вы можете просто прочитать в двухбайтах, а затем преобразовать в однобайтовые значения с high = два байта << 8;низкий = два дня и FF;
3) %2x