C /C ++ считывает байт из шестнадцатеричного ввода из stdin

StackOverflow https://stackoverflow.com/questions/512941

  •  21-08-2019
  •  | 
  •  

Вопрос

Не могу точно найти способ, как сделать следующее на 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 - указатель на ФАЙЛОВЫЙ объект, который указывает входной поток.

cplusplus ref

Это было полезно?

Решение

%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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top