【发布时间】:2011-07-15 12:37:33
【问题描述】:
如何使用 C 将 8 位二进制字符串(例如“10010011”)转换为十六进制?
【问题讨论】:
-
看起来和converting-binary-to-hexadecimal基本一样
-
@MAK 它们与它提到的“字符串”和“C”编程语言不一样
如何使用 C 将 8 位二进制字符串(例如“10010011”)转换为十六进制?
【问题讨论】:
#include <stdlib.h>
strtol("10010011", NULL, 2);
【讨论】:
类似的东西:
char *bin="10010011";
char *a = bin;
int num = 0;
do {
int b = *a=='1'?1:0;
num = (num<<1)|b;
a++;
} while (*a);
printf("%X\n", num);
【讨论】:
num 右移超过sizeof(int)*CHAR_BIT - 1 次,或者得到的数学值不能用num 表示,它可能导致UB。这里都没有发生,所以没有 UB。一般来说,如果操作不正确,移动有符号数字很容易导致 UB。但并不总是 UB。不过,在大多数情况下,使用 unsigned 可以省去麻烦;-)
void binaryToHex(const char *inStr, char *outStr) {
// outStr must be at least strlen(inStr)/4 + 1 bytes.
static char hex[] = "0123456789ABCDEF";
int len = strlen(inStr) / 4;
int i = strlen(inStr) % 4;
char current = 0;
if(i) { // handle not multiple of 4
while(i--) {
current = (current << 1) + (*inStr - '0');
inStr++;
}
*outStr = hex[current];
++outStr;
}
while(len--) {
current = 0;
for(i = 0; i < 4; ++i) {
current = (current << 1) + (*inStr - '0');
inStr++;
}
*outStr = hex[current];
++outStr;
}
*outStr = 0; // null byte
}
【讨论】:
怎么样
char *binary_str = "10010011";
unsigned char hex_num = 0;
for (int i = 0, char *p = binary_str; *p != '\0'; ++p, ++i)
{
if (*p == '1' )
{
hex_num |= (1 << i);
}
}
现在你已经有了 hex_num,你可以用它做你想做的事。请注意,您可能希望验证输入字符串的长度或将循环限制为 hex_num 中的位数。
【讨论】: