在 C 中将 Base 16(十六进制)转换为 Base 36 字符串

Vol*_*ike 3 c hex base-conversion base36

在 C 中,将 64 个字符的十六进制数(作为字符串)转换为基数 36 字符串的有效方法是什么?

我的意思是,这是否像组合一些 GLIB2 函数(在 Linux 上)或标准库函数一样简单?或者,我必须全部定制吗?

chu*_*ica 5

将 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)