我是C的新手,希望对我遇到的问题有所帮助。
假设我有一个包含32位模式的字符串,例如“10001100110100010101100111000000”。
我坚持的是如何为字符串中的位模式创建一个十六进制数,以便该数字包含4位组。
例如,我对上面的字符串所需的十六进制表示将是8CD159C0
答案 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;
}