将二进制转换为十六进制并进行操作

时间:2018-04-04 06:01:45

标签: c

我是C的新手,我已经尝试了很多方法将char*变量存储为binary表示形式转换为hex值。

变量例如是:

0110110000001110110000010100111000110011110110110111000110111000

代表

6C 0E  C1 4E 33 DB  71 B8

,其中

0110- 6, 1100 - C, 0000 - 0, 1110 - E and so on...  

但是,当我想使用fprintf格式或strtol时,我发现这是针对此类问题的建议,我得到:

char* lm_bin = "0110110000001110110000010100111000110011110110110111000110111000";
//convert to dec
int lm_dec = (int)strtol(lm_bin, NULL, 2);
char lm_hex[12];
//convert to hex
sprintf(lm_hex, "%x", lm_dec);
fprintf(stderr, "binary %s", lm_bin);
fprintf(stderr, "hex %s", lm_hex);

输出是:

  

二进制   0110110000001110110000010100111000110011110110110111000110111000 hex   33db71b8

这是不正确的。谁能指出我在哪里犯错?

1 个答案:

答案 0 :(得分:3)

为什么要尝试将16个十六进制字符压缩成12个字节的字符串,这个字符串只能处理11个字符加上一个空终止符。如果在适当的点包含换行符,它还有助于输出的可读性。使用unsigned long longstrtoull()时,您可能会做得更好 - int在大多数计算机上都不会保留16位十六进制数字。在标准输出上写入预期输出也是常规的;对错误消息使用标准错误。

将这些更改放在一起会产生一个MCVE(Minimal, Complete, Verifiable Example),如下所示:

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

int main(void)
{
    const char lm_bin[] = "0110110000001110110000010100111000110011110110110111000110111000";
    unsigned long long lm_dec = strtoull(lm_bin, NULL, 2);
    char lm_hex[17];
    sprintf(lm_hex, "%llx", lm_dec);
    printf("binary %s\n", lm_bin);
    printf("hex %s\n", lm_hex);
    return 0;
}

我相信,你所寻求的产出就是你所想要的:

binary 0110110000001110110000010100111000110011110110110111000110111000
hex 6c0ec14e33db71b8

该代码不检查转换错误,可以使用snprintf()代替sprintf(),并且可以通过一次调用printf()完成所有打印 - 而且不需要将字符串用于十六进制格式的输出(它可以直接格式化lm_dec)。因此,代码中有很多变化和改进的空间。