При преобразовании необработанного символа в шестнадцатеричный эквивалент возвращается неправильное значение - PullRequest
0 голосов
/ 29 мая 2019

У меня есть приложение, в котором входные данные представляют собой необработанный набор байтов, и я хочу видеть двухзначный шестнадцатеричный код каждого из этих байтов. Сейчас я пытаюсь получить правильный шестнадцатеричный код для одного байта. Это мой код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
char hexvc; //= ascii code for hex value
char aval[2]={0xFF,0x00}; //Our raw 1 byte data. can't print actual code here
char hexv[20]; //value for output
memset(hexv,0,19); //clear output
hexvc=strtol(aval,NULL,16) & 0xFF;
if (hexvc != '\0'){
    sprintf(hexv,"%02hx",hexvc);
}else{
    //hexvc always equals 0. why not FFh?
    strcpy(hexv,"00");
}
printf("%s\n",hexv);
return 0;
}

Я ожидал увидеть ff на экране, но вместо этого я вижу 00. Как это исправить?

И если я изменю 0xFF после aval[2]= на 0x31 или '1' (так как 1 является фактическим значением для кода ASCII 0x31), то я хочу, чтобы на экране появилось 31.

Ответы [ 3 ]

0 голосов
/ 29 мая 2019
char aval[] = {0x66, 0x66, 0x00};

0x66 это символ 'f' в ascii

0 голосов
/ 29 мая 2019

Значения могут быть напечатаны напрямую без strtol

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    unsigned char aval[9]={0xFF,0x00,0xF0,0x0f,0xAA,0xBB,0x00,0x0E,0xFF};
    char hexv[20]; //value for output
    char *hexvc = hexv;
    memset(hexv,0,19); //clear output
    for ( int each = 0; sizeof aval > each; ++each){
        sprintf ( hexvc,"%02hhx",aval[each]);
        hexvc += 2;
    }
    printf("%s\n",hexv);
    return 0;
}
0 голосов
/ 29 мая 2019

aval [2] = {0xFF, 0x00};

Это не ascii.

aval [] = {'f', 'f', 0x00};

Или

aval [] = "ff";

Апопробуйте еще раз

...