在 C 中将大位字符串转换为十六进制

标签 c cryptography binary hex ansi-c

我需要像这样转换大位字符串:

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/

相关文章:

c - 如何将 CRC 函数从 C 转换为 Ruby?

c - 异步模式下的Linux串口读取

android - lsetfilecon失败:传输端点上不支持该操作

c# - 64 位定点乘法错误

c - 为什么我不能在 Windows 7 中测试返回码?

javascript - AES-128-GCM 是否在 Node V6 上验证 IV?

java - 在 .exe 中打包时出现 AES 256 加密/解密 NoSuchProviderException(使用 Advanced Installer 9.4)

java - AES 加密 : Encrypt using Arduino and decrypt using Java

c++ - 如何在 C++ 中找到 ELF 二进制文件所需的动态库?

C 整数数组,表示为转换为十进制的位