二进制到十进制和十六进制在C中

时间:2018-03-25 13:30:53

标签: c binary hex decimal

我想创建将以十六进制形式返回数字的函数。但是在更改为十进制数字后,我得到了一些错误的数字。在输出中,第一个数字是二进制,第二个数字也是二进制但是以int格式,第三个应该是十进制。但我得到十进制的错误数字(见第二行,它应该是156,而不是220)。任何人都可以解释一下我做错了什么,我怎样才能获得正确的数字?谢谢。这是我的输出:

enter image description here

    char *encrypted = calloc((size_t)TEXT_LEN*3, sizeof(char));
int number[TEXT_LEN];
index=0;
for(int i=0;i<TEXT_LEN;i++){

    number[i]=atoi(binary[i]);

    printf("%s ",binary[i]);
    printf("%d ",number[i]);
    printf("%d\n",(unsigned char)number[i]);

    sprintf(encrypted+index,"%x ",(unsigned char)number[i]);

    index+=3;
}

printf("%s\n",encrypted);
free(encrypted);

编辑:我在评论中找到了解决方案,并通过使用函数strtol在行中修复了它:

number [i] = strtol(binary [i],NULL,2);

2 个答案:

答案 0 :(得分:1)

如果数字值小于16,则写入的字符串长度为2,最后是char&#39; \ 0&#39;插入。使用固定大小

sprintf(encrypted+index,"%02x ", number[i]);
index += 3;

或使用sprintf函数的返回值,该函数是写入的字符串长度,用于递增索引

index += sprintf(encrypted+index,"%x ", number[i]);

我更喜欢两者的组合

index += sprintf(encrypted+index,"%02x ", number[i]);

基于二进制的八个字符串,上面的user3121023的方法将为您提供正确的十进制数

number[i] = strtol(binary[i], NULL, 2);
printf("%s ", binary[i]); // 1st col
printf("%d\n", number[i]); // 2nd col

答案 1 :(得分:1)

在第二行输出中,我写了一个C plus plus程序来解释你的疑问:

-(select Sum (isnull(CAST(Quantity*100  as float),0)) from Tables

十进制数10011100转换为二进制数int value = 10011100; cout<<bitset<sizeof(int)*8>(value)<<value<<endl; // 0000000010011000110000011101110010011100 unsigned char va = (unsigned char)value; cout<<bitset<sizeof(unsigned char)*8>(va)<<endl; // 11011100 ,然后将其放入unsigned char,我们得到10011000110000011101110010011100,它是220。