c++ - 为什么他们想要一个 'unsigned char*' 而不仅仅是一个普通的字符串或 'char*'

标签 c++ c hash

编辑:接受建议后,我重新安排了参数和类型。但是当我现在调用 digest() 函数时应用程序崩溃了?有什么想法出了什么问题吗?

const std::string message = "to be encrypted";
unsigned char* hashMessage;

SHA256::getInstance()->digest( message, hashMessage ); // crash occurs here, what am I doing wrong?
printf("AFTER: n"); //, hashMessage); // line never reached

我正在使用 C++ 中 SHA256 算法的开源实现。我的问题是了解如何传递我的字符串的 unsigned char* 版本以便对其进行哈希处理?

这是一个接受我的字符串的 unsigned char* 版本的函数:

void SHA256::digest(const std::string &buf, unsigned char *dig) {
    init();
    update(reinterpret_cast<const unsigned char *>(buf.c_str()), static_cast<unsigned int>(buf.length()));
    final();
    digest(dig);
}

如何将我的字符串(我想对其进行哈希处理)转换为 unsigned char*?

我编写的以下代码在打印字符串内容时导致运行时错误:

const std::string hashOutput;
char message[] = "to be encrypted";

printf("BEFORE: %s bb\n", hashOutput.c_str());
SHA256::getInstance()->digest( hashOutput, reinterpret_cast<unsigned char *>(message) );
printf("AFTER: %s\n", hashOutput.c_str()); // CRASH occurs here

PS:我一直在研究 SHA256 的许多实现,它们都采用 unsigned char* 作为要散列的消息。他们为什么这样做?为什么不用 char* 或字符串来代替?

最佳答案

您的参数设置有误。 Buf 是输入(要散列的数据),dig 是输出摘要(散列)。

此外,哈希是二进制数据。在将其打印到屏幕之前,您必须将所述二进制数据转换为某种字符串表示形式。通常,人们为此选择使用十六进制字符串。

关于c++ - 为什么他们想要一个 'unsigned char*' 而不仅仅是一个普通的字符串或 'char*',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7625304/

相关文章:

c - 二维指针的作用类似于二维数组

c++ - 函数模板特化以强制使用类型的枚举值

java - 在 Java 中创建数组(C++ 风格)

C++ 将函数从 DLL 加载到 Boost 函数中

objective-c - ios 中的哈希和漩涡?

PHP - 以某种方式散列对象具有相同字段值的不同对象具有相同的散列

c++ - 动态哈希->类标签

c++ - C/C++大数计算

c - C中的stdout和stderr有什么区别?

c - 两个元素相加的数据结构