从原始字符转换为等效十六进制时返回错误的值

时间:2019-05-29 16:32:47

标签: c binary hex ascii data-conversion

我有一个应用程序,其中输入是一组原始字节,我想查看每个字节的两位十六进制代码。现在,我正在尝试获取一个字节的正确十六进制代码。这是我的代码:

#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的实际值),那么我想看{{1 }}出现在屏幕上。

3 个答案:

答案 0 :(得分:0)

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

这不是ascii。

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

aval [] =“ ff”;

然后重试

答案 1 :(得分:0)

可以直接打印值,而无需使用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;
}

答案 2 :(得分:-1)

char aval[] = {0x66, 0x66, 0x00};

0x66是ascii中的字符'f'