我需要获取给定无符号字符数组的哈希(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;
}
答案 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);