c - 将十六进制格式的整数数组保存到 char "string"

标签 c hex

我有这段代码可以生成带有 SHA384 哈希的 HMAC。它使用 openssl

HMAC_CTX ctx;
HMAC_CTX_init(&ctx);

HMAC_Init_ex(&ctx, api_secret, (int)strlen(api_secret), EVP_sha384(), NULL);
HMAC_Update(&ctx, (unsigned char*)&encoded_payload, strlen(encoded_payload));
HMAC_Final(&ctx, result, &len);
HMAC_CTX_cleanup(&ctx);

for (int i = 0; i != len; i++)
    printf("%02x", (unsigned int)result[i]);

因此,如您所见,散列存储在 result 数组中。 printf 循环用于打印数组中的每个单元,并将其转换为十六进制。

我需要将打印的十六进制字符串存储在 char 变量中。我怎样才能做到这一点?提前致谢!

最佳答案

1st 分配整个散列的“字符串”表示所需的空间:

  • 从 C99 开始,这可以使用 VLA 完成:

    char str[2*len + 1] = "";
    
  • 或者动态分配:

    char * str = calloc(2*len + 1, sizeof(*str));
    

然后使用sprintf()获取单个字节的表示并连接它们:

for (size_t i = 0; i < len; ++i)
{
  char tmp[3];
  /* Use the hh length modifier, together with casting to a character to make sure to
     NOT overflow tmp. */
  sprintf(tmp, "%02hhx", (unsigned char) result[i]);
  strcat(str, tmp);
}

如果使用了动态分配,不要忘记释放分配给 s 的内存(如果不再需要的话):

free(str);

关于c - 将十六进制格式的整数数组保存到 char "string",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22127523/

相关文章:

c - 从 C 中的 unsigned int 末尾获取 'n' 二进制位?位掩码?

c - 使用二进制(十六进制)文件中的 fread 交换字节

c - 如何将 ANSI C 函数原型(prototype)与 Oracle Pro*C 结合使用?

c - 我如何检查c中信号量的状态?

Java 十六进制字符串连接校验和

c++ - 从 MIDI 文件获取 MIDI 字节数组

java - 将十六进制字符串解析为整数会引发 NumberFormatException?

c - C语言中如何对链表进行排序?

c++ - 从缓冲区中删除第 n 位,然后移动其余位

c - strlen 没有给出正确的字符串长度 C