Vol*_*ike 3 c hex base-conversion base36
在 C 中,将 64 个字符的十六进制数(作为字符串)转换为基数 36 字符串的有效方法是什么?
我的意思是,这是否像组合一些 GLIB2 函数(在 Linux 上)或标准库函数一样简单?或者,我必须全部定制吗?
将 Base 16(十六进制)转换为 Base 36 字符串
使用一些标准 C 函数即可轻松完成。
形成“串倍”功能。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
static char *str_times(char *s, int base, int times, int carry) {
size_t len = strlen(s);
for (size_t i = len; i > 0;) {
i--;
// Convert character digit into into value
// |-------------------------------------|
int acc = strtol((char[2] ) { s[i], 0 }, 0, base) * times + carry;
s[i] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[acc % base];
carry = acc / base;
}
while (carry) {
memmove(&s[1], &s[0], ++len);
s[0] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[carry % base];
carry /= base;
}
return s;
}
char *str_base_convert(char *dest, int base_dest, const char *src, int base_src) {
strcpy(dest, "0");
while (*src) {
str_times(dest, base_dest, base_src, strtol((char [2]) {*src,0}, 0, base_src));
src++;
}
return dest;
}
char *str16_to_str36(char *dest, const char *src) {
return str_base_convert(dest, 36, src, 16);
}
Run Code Online (Sandbox Code Playgroud)
使用示例
int main(void) {
char dest[51]; // Size for 64-digit hexadecimal number in base 36
puts(str16_to_str36(dest, "1"));
puts(str16_to_str36(dest, "24"));
puts(str16_to_str36(dest, "FF"));
puts(str16_to_str36(dest, "FFFFffff"));
puts(str16_to_str36(dest,
"FFFFffffFFFFffffFFFFffffFFFFffffFFFFffffFFFFffffFFFFffffFFFFffff"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出
1
10
73
1Z141Z3
6DP5QCB22IM238NR3WVP0IC7Q99W035JMY2IW7I6N43D37JTOF
Run Code Online (Sandbox Code Playgroud)