C / C ++ lido um byte de um hexinput de stdin
Pergunta
Não é possível exatamente encontrar uma maneira de como fazer o seguinte em C / C ++.
Entrada: valores hexadecimal, por exemplo: FFFFFFFFFF ...
Eu tentei o código a seguir, a fim de ler a entrada:
uint16_t twoBytes;
scanf("%x",&twoBytes);
Isso funciona bem e tudo, mas como faço para dividir os 2bytes em 1bytes uint8_t
valores (ou talvez até mesmo ler apenas o primeiro byte). Gostaria de ler o primeiro byte da entrada, e armazená-lo em uma matriz de bytes em uma posição de escolher.
uint8_t matrix[50][50]
Desde que eu não estou muito hábil na formatação / lendo da entrada em C / C ++ (e só tenho usado scanf até agora) quaisquer outras ideias sobre como fazer isso facilmente (e rápido se vai) é muito apreciada.
Edit:. Encontrado mesmo um melhor método usando a função fread uma vez que permite uma especificar quantos bytes deve ler-se a partir do fluxo (stdin, neste caso) e salvar em uma variável / array
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
Parâmetros
ptr -. Ponteiro para um bloco de memória com um tamanho mínimo de (tamanho * Contagem) bytes
tamanho -. Tamanho em bytes de cada elemento a ser lido
contagem -. Número de elementos, cada uma com um tamanho de bytes de tamanho
stream - Ponteiro para um objeto de arquivo que especifica um fluxo de entrada.
Solução
%x
lê um unsigned int
, não um uint16_t
(pensei que eles podem ser o mesmo em sua plataforma específica).
Para ler apenas um byte, tente o seguinte:
uint32_t byteTmp;
scanf("%2x", &byteTmp);
uint8_t byte = byteTmp;
Isto lê um unsigned int
, mas pára depois de ler dois personagens (dois caracteres hexadecimais é igual a oito bits, ou um byte).
Outras dicas
Você deve ser capaz de dividir a variável assim:
uint8_t LowerByte=twoBytes & 256;
uint8_t HigherByte=twoBytes >> 8;
Um casal de pensamentos:
1) lê-lo como caracteres e convertê-lo manualmente - doloroso
2) Se você sabe que há um múltiplo de 4 hexits, você pode apenas ler em twobytes e depois converter para valores de um byte com altos = twobytes << 8; baixos = twobyets e FF;
3)% 2x