- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Microsoft 的 CNG Cryptography API 来计算文件的哈希值,到目前为止一切正常,除了与使用外部第 3 方程序计算的哈希值相比计算出的哈希值是错误的。
我不是 100% 确定,但我认为问题是我将文件读入 signed char
数组而不是 BYTE
(unsigned char) 数组。
下面的代码是我现在读取文件的方式:(注意:我省略了错误检查代码)
std::ifstream file;
file.open("sample.txt", std::ifstream::binary | std::ifstream::in | std::ifstream::ate);
const int file_length = file.tellg();
char* data = new char[file_length];
file.seekg(file.beg);
file.read(data, file_length);
上面代码的问题是数据被读入有符号的 char 数组,但加密函数需要 unsigned char/BYTE
,我猜这就是我计算的哈希值错误的原因。
下面的代码是我想做的,但它不起作用(添加注释),因为 ifstream::read()
方法需要 char
数组而不是 无符号字符/字节
std::ifstream file;
file.open("sample.txt", std::ifstream::binary | std::ifstream::in | std::ifstream::ate);
const int file_length = file.tellg();
PBYTE data = new BYTE[file_length];
file.seekg(file.beg);
file.read(data, file_length); // error PBYTE is incompatibe with char*
所以我的问题是:如何将数据读取为 BYTE
而不是 char
我需要使用 CreateFile
API 还是有办法使用 std::ifstream
?
也许还有其他原因导致计算的哈希值错误,我不知道是否可以告诉我。
编辑:下面是计算给定文件名的 SHA256 哈希的完整工作代码,但哈希是错误的。 (即,与使用 3rd 方哈希实用程序完成的不同)
#include <windows.h>
#include <bcrypt.h>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <fstream>
#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)
std::string ByteToHex(PBYTE data, size_t len)
{
std::stringstream ss;
ss << std::hex << std::setfill('0') << std::uppercase;
for (size_t i = 0; i < len; ++i)
{
ss << std::setw(2) << static_cast<short>(data[i]);
}
return ss.str();
}
int main()
{
BCRYPT_ALG_HANDLE hAlg = nullptr;
BCRYPT_HASH_HANDLE hHash = nullptr;
DWORD cbHash, cbObject, cbData;
PBYTE pbHash, pbObject;
NTSTATUS status = STATUS_UNSUCCESSFUL;
std::ifstream file;
file.open("sample.exe", std::ifstream::binary | std::ifstream::in | std::ifstream::ate);
const int file_length = file.tellg();
if (!file.is_open())
{
abort();
}
PBYTE data = new BYTE[file_length];
file.seekg(file.beg);
file.read(reinterpret_cast<char*>(data), file_length);
status = BCryptOpenAlgorithmProvider(
&hAlg,
BCRYPT_SHA256_ALGORITHM,
nullptr,
0);
if (NT_SUCCESS(status))
{
status = BCryptGetProperty(
hAlg,
BCRYPT_OBJECT_LENGTH,
reinterpret_cast<PBYTE>(&cbObject),
sizeof(DWORD),
&cbData,
0);
}
else
{
abort();
}
pbObject = reinterpret_cast<PBYTE>(
HeapAlloc(GetProcessHeap(), 0, cbObject));
if (!pbObject)
{
abort();
}
if (NT_SUCCESS(status))
{
status = BCryptGetProperty(
hAlg,
BCRYPT_HASH_LENGTH,
reinterpret_cast<PBYTE>(&cbHash),
sizeof(DWORD),
&cbData,
0);
}
else
{
abort();
}
pbHash = reinterpret_cast<PBYTE>(
HeapAlloc(GetProcessHeap(), 0, cbHash));
if (!pbHash)
{
abort();
}
if (NT_SUCCESS(status))
{
status = BCryptCreateHash(
hAlg,
&hHash,
pbObject,
cbObject,
nullptr,
0,
0);
}
else
{
abort();
}
if (NT_SUCCESS(status))
{
status = BCryptHashData(
hHash,
(PBYTE)(data),
sizeof(data),
0);
}
else
{
abort();
}
if (NT_SUCCESS(status))
{
status = BCryptFinishHash(
hHash,
pbHash,
cbHash,
0);
}
else
{
abort();
}
std::cout << ByteToHex(pbHash, cbHash).c_str();
delete[] data;
if(hAlg) BCryptCloseAlgorithmProvider(hAlg, 0);
if(hHash) BCryptDestroyHash(hHash);
if(pbHash) HeapFree(GetProcessHeap(), 0, pbHash);
if(pbObject) HeapFree(GetProcessHeap(), 0, pbObject);
return 0;
}
最佳答案
当调用read
或write
时,这是少数可以使用reinterpret_cast
的情况之一。 .在某些情况下,没有其他可行的解决方案。
所以对于你的情况:
file.read(reinterpret_cast<char*>(data), file_length);
关于c++ - std::ifstream 将文件读取为 BYTE(unsigned char)而非 char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55568012/
根据 C++11 标准,是 的行为 ifstream in("."); 指定的,还是系统相关的? 对于上下文,我试图避免使用 boost::filesystem 和类似的库,因为它们会导致不相关的可移
我尝试使用 ifstream 读取一个 3GB 的数据文件,但它给出了错误的文件大小,而当我读取一个 600MB 的文件时,它给出了正确的结果。除了错误的文件大小,我也无法使用 ifstream 读取
这里有没有人知道 C++ ifstream 的 get 指针在调用 read() 后可能会损坏的方法?我看到了一些我无法解释的真正奇怪的行为。例如(说明性代码,而不是我实际运行的代码): int ma
我正在编写一个外部合并排序。它是这样工作的:从大文件中读取 k 个 block ,在内存中对它们进行排序,执行 k 路合并,完成。所以我需要在 k-way 合并阶段从文件的不同部分顺序读取。最好的方法
阅读 Savitch 的 Problem Solving in C++,std::ifstream::fail 以检查文件是否已正确打开(ifstream 或 ofstream)。 正如我第一次看到的
我正在尝试逐行读取多个文件(本例中为 3 个)并使用 ifstream shared_ptrs vector 来执行此操作。但我不知道如何取消引用此指针以使用 getline() 或我的代码中存在其他
我正在编写一个程序,它从一个文本文件中获取多个变量。当程序发现EOF时, 它结束输入数据。 int main() { int val, count = 0; ifstream file
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我想知道在什么情况下我们可以拥有: bool(std::ifstream) != std::ifstream::good() 区别在于 bool(std::ifstream) 不测试 eof 位,而
也许是个伪问题,但我需要一个明确的答案。这些函数的返回有什么不同吗 int FileExists(const std::string& filename) { ifstream file(file
我只是采用了一些在 Linux 下开发的文件阅读器的旧代码,并尝试在我的 Windows 项目中使用完全相同的代码,该项目是用 MSVC++7.1 编译的。代码编译没有任何问题,但根据 Windows
是var > var相同? 据我所知,它们应该完全相同。但是已经很晚了,我的大脑处于半睡状态,所以我想澄清一下。 最佳答案 它们不一样。 foo > foo是bar.operator>>(foo)或
我一直在测试使用 Visual Studio 在 C++ 中读取文件的性能,我得到了一些我真的不明白的结果。 我的代码如下: std::vector Method1(std::string fileP
我使用 SymbolHound 在网络上查找比较两者的资源,但找不到任何东西。 在 VS13 中寻找 std::ifstream::in 的声明和定义让我找到了 basic_ifstream。寻找 s
我无法将图像文件读入缓冲区。当我读取普通的 ascii 文件时,一切都很好,但当涉及到图像文件时,我怀疑图像文件中有一个\0 字符? 我需要接收图像文件,将其解析为 16KB 的 block 以进行哈
我知道已经有很多关于如何迭代 ifstream 的答案,但没有一个真正帮助我找到解决方案。 我的问题是:我有一个包含多行数据的txt文件。 txt 文件的第一行告诉我其余数据是如何组成的。例如这是我的
首先,我为我的英语表示歉意。 我在尝试编写一个 XML 解析器时遇到了一个奇怪的问题。为了解释我的问题,我应该说,我有一个 xml 解析器类,它有一个 ifstream 成员。这个类有一个函数,它会读
我正在使用 xcode。我编译得很好,然后一旦它运行它就成功打开文件,然后读取两个值,但这些值不会进入变量,因此它会跳过 for 循环并关闭文件并从 main 返回。 #include #inclu
我有一个包含以下格式数据的文件: name1 p1 p2 ... p11 name2 p1 p2 ... p11 ... (参数不一定在一行) 我的目标是读取名称和 11 个参数,对它们做一些事情,然
我正在尝试读取一个输入文件,该文件的格式为一行中有两个数字,并将该行中的第一个数字存储在一个 vector 中,将第二个数字存储在另一个 vector 中。 除了实际读取文件之外,我的代码的每个部分都
我是一名优秀的程序员,十分优秀!