字符串中的二进制位模式转换为C中的十六进制数

时间:2014-01-21 23:02:42

标签: c hex bits

我是C的新手,希望对我遇到的问题有所帮助。

假设我有一个包含32位模式的字符串,例如“10001100110100010101100111000000”。

我坚持的是如何为字符串中的位模式创建一个十六进制数,以便该数字包含4位组。

例如,我对上面的字符串所需的十六进制表示将是8CD159C0

4 个答案:

答案 0 :(得分:2)

您可以使用base 2:

将二进制字符串转换为strtoul()的数字
char *bits = "10001100110100010101100111000000";
unsigned num = strtoul(bits, NULL, 2);

然后将数字转换为带有snprintf()的十六进制字符串:

char hex[9];
snprintf(hex, sizeof(hex), "%08X", num);

printf("%s\n", hex);
// Output: 8CD159C0

(这假设unsigned int在您的平台上至少有32位。 否则使用unsigned long。)

答案 1 :(得分:2)

Yosi几乎得到了它。但它应该是一个无符号的int。

char *bin="10001100110100010101100111000000";
unsigned int num = 0;
for (char *a = bin; *a; ++a)
    num = (num << 1) | (*a - '0');
printf("%X\n", num);

答案 2 :(得分:1)

试一试:

char *bin="10001100110100010101100111000000";
char *a = bin;
int num = 0;
do {
    int b = *a=='1'?1:0;
    num = (num<<1)|b;
    a++;
} while (*a);
printf("%X\n", num);

答案 3 :(得分:0)

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

//#define b2i(c) (c == '1' ? 1 : 0)
#define I(c) c - '0'

char table[2][2][2][2] = {
    '0','1','2','3','4','5','6','7',
    '8','9','A','B','C','D','E','F'
};

char *bin2hex(const char *binstr){
    size_t len = strlen(binstr);
    size_t r = len % 4;//len & 3
    size_t add_len = (4 - r) % 4;
    len += add_len;
    char *bin = malloc(len + 1);
    strncpy(bin, "0000", add_len);//Normalization
    strcpy(bin + add_len, binstr);
    size_t hex_len = len / 4;// len >> 2;
    char *hexstr = malloc(hex_len + 1);
    size_t b, h;
    for(h=b=0;b<len; b+=4){
        hexstr[h++] = table[I(bin[b])][I(bin[b+1])][I(bin[b+2])][I(bin[b+3])];
    }
    hexstr[h] = '\0';
    free(bin);
    return hexstr;
}

int main(void){
    const char *bin = "10001100110100010101100111000000";
    char *hex = bin2hex(bin);
    printf("%s\n", hex);//8CD159C0
    free(hex);
    return 0;
}