如何将包含两个十六进制值的无符号char变量转换为一个十六进制数的两个char

时间:2019-05-26 22:26:49

标签: c++

我需要获取给定无符号字符数组的哈希(sha1)值。因此,我使用过openssl。 SHA1函数在具有20个值的无符号char数组中生成哈希值。实际上,每个值代表两个十六进制值。

但是,我应该将生成的数组(长度为20)转换为具有40个值的char数组。

例如,现在hashValue [0]为“ a0”,但我想让hashValue [0] =“ a”和hashValue [1] =“ 0”

#include <iostream>
#include <openssl/sha.h> // For sha1

using namespace std; 

int main() {

    unsigned char plainText[] = "compute sha1";
    unsigned char hashValue[20];

    SHA1(plainText,sizeof(plainText),hashValue);

    for (int i = 0; i < 20; i++) {
        printf("%02x", hashValue[i]);
    }
    printf("\n");

    return 0;

}

2 个答案:

答案 0 :(得分:0)

您可以创建另一个数组,并使用sprintf或更安全的snprintf打印到数组中,而不是使用标准输出。

类似这样的东西:

#include <iostream>
#include <stdio.h>
#include <openssl/sha.h> // For sha1

using namespace std; 

int main() {

    unsigned char plainText[] = "compute sha1";
    unsigned char hashValue[20];
    char output[41];

    SHA1(plainText,sizeof(plainText),hashValue);

    char *c_output = output;
    for (int i = 0; i < 20; i++, c_output += 2) {
        snprintf(c_output, 3, "%02x", hashValue[i]);
    }

    return 0;

}

现在output[0] == 'a'output[1] == '0'

可能还有其他甚至更好的解决方案,这只是我想到的第一个。

编辑:添加了注释修复程序。

答案 1 :(得分:0)

似乎想要分隔高位字节和低位字节。

要隔离高位字节,请向右移4个字节。 为了隔离低位字节,请使用掩码。与0x0f

int x = 0x3A;
int y = x >> 4;   // get high order nibble
int z = x & 0x0F; // get low order nibble
printf("%02x\n", x);
printf("%02x\n", y);
printf("%02x\n", z);