我需要像这样转换大位字符串:
unsigned char* key = "0111010111010101010101010100101011010";
像这样的十六进制字符串:
unsigned char* string = EBAAAA95A;
问题是我的 key 通常长于 50 或 60 位,当我尝试使用 strtoll(key, NULL, 2)
转换它们时,返回的数字远远大于long long int
甚至可以容纳。有没有一种有效的方法可以直接将其转换为十六进制?
非常感谢您的帮助!
最佳答案
我认为您需要推出自己的实现。这是一个从 @mediocrvegetable 获得灵感的实现
#include <stdlib.h>
#include <string.h>
static inline int bitstr_to_int(const char *str, int len)
{
int h = 0;
for (int i = 0; i < len; i++) {
switch (str[i]) {
case '0': h *= 2; continue;
case '1': h *= 2; h++; continue;
default: return -1;
}
}
return h;
}
char * bitstr_to_hexstr(const char *str, int len)
{
static const char hex_digit[] = {
'0', '1', '2', '3',
'4', '5', '6', '7',
'8', '9', 'A', 'B',
'C', 'D', 'E', 'F'
};
int i = 0; //traces the input chars in bitstr
int j = 0; //traces the output chars in hexstr
int h = 0;
int r = len % 4;
int q = len / 4;
char *hexstr = malloc(q + !!r + 1);
if (hexstr == NULL) return NULL;
if (r != 0) {
h = bitstr_to_int(str, r);
if (h == -1) goto err;
hexstr[j++] = hex_digit[h];
}
for (i = r; i < len; i += 4) {
h = bitstr_to_int(str+i, 4);
if (h == -1) goto err;
hexstr[j++] = hex_digit[h];
}
hexstr[j] = '\0';
return hexstr;
err:
free(hexstr);
return NULL;
}
int main(void)
{
const char *key = "0111010111010101010101010100101011010";
char *res = bitstr_to_hexstr(key, strlen(key));
printf("%s\n", res);
}
关于在 C 中将大位字符串转换为十六进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69243037/