C++ 如何在表示二进制文件的字符串中查找整数

C++ 如何在表示二进制文件的字符串中查找整数,c++,C++,如何在表示二进制文件的字符串中找到整数 比如说, const std::string pe_file_path(argv[1]); std::ifstream pe_file(pe_file_path, std::ios_base::binary); const std::string pe_file_content((std::istreambuf_iterator<char>(pe_file)), std::istreambuf_iterator<char>());

如何在表示二进制文件的字符串中找到整数

比如说,

const std::string pe_file_path(argv[1]);
std::ifstream pe_file(pe_file_path, std::ios_base::binary);
const std::string pe_file_content((std::istreambuf_iterator<char>(pe_file)), std::istreambuf_iterator<char>());
DWORD some_value = 0x243e0c10;
// pe_file_content.find(???);

但是我想可以有更优雅的方法来解决这个问题。

我想您可以使用相同的方法将DWORD转换为stringstream,并使用string::find函数来查找数字的位置。

我想您可以使用相同的方法将DWORD转换为stringstream并使用string::find函数函数查找数字的位置。

如果
pe\u file\u content
包含四个字节
0x24
0x3E
0x0C
0x10
,而不是将它们表示为字符的八个字节,则需要将
DWORD
值转换为包含这些字节的字符串,然后你可以搜索它:

std::string needle(reinterpret_cast<const char*>(&some_value), sizeof(some_value));
pe_file_content.find(needle);
std::字符串指针(重新解释施法(&some_值),大小(some_值));
pe_文件内容。查找(针);

注意字节顺序。如果文件中的整数没有与计算机相同的尾数,则在搜索之前需要颠倒
某些值的字节顺序。

如果
pe\u文件内容
包含四个字节
0x24
0x3E
0x0C
,和
0x10
,而不是将它们表示为字符的八个字节,那么您需要将
DWORD
值转换为包含这些相同字节的字符串,然后您可以搜索:

std::string needle(reinterpret_cast<const char*>(&some_value), sizeof(some_value));
pe_file_content.find(needle);
std::字符串指针(重新解释施法(&some_值),大小(some_值));
pe_文件内容。查找(针);

注意字节顺序。如果文件中的整数没有与计算机相同的尾数,则需要在搜索之前反转
某些值的字节顺序。

您是说like?小心忍耐。我也不知道
std::string
是否是二进制数据的最佳选择…@simonkraemer是的。但是我已经有了一个
DWORD
变量,你要搜索的总是
DWORD
吗?你是说喜欢吗?小心忍耐。我也不知道
std::string
是否是二进制数据的最佳选择…@simonkraemer是的。但是我已经有了一个
DWORD
变量,你要搜索的总是
DWORD
吗?你的意思是这样的<代码>标准::ostringstream oss;你是说像这样<代码>标准::ostringstream oss;oss这样使用
reinterpret\u cast
安全吗?这正是
reinterpret\u cast
存在的原因。严格的别名规则明确规定,通过
char*
引用任何对象都是例外。如果您只使用
DWORD
(4字节值),您也可以手动执行转换:
std::string some_value_str={(char)((some_value&0xFF000000)>>24),(char)((some_value&0x00FF0000)>>16),(char)((某些值&0x0000FF00)>>8,(字符)(某些值&0x000000FF)>>0)}
像这样使用
reinterpret\u cast
安全吗?这正是
reinterpret\u cast
存在的情况。严格的别名规则明确规定,通过
char*
引用任何对象都是例外。如果只使用
DWORD
(4字节值)您还可以手动执行转换:
std::string some-u-value\u-str={(char)((some-u-value&0xFF000000)>>24),(char)((some-u-value&0x00FF0000)>>16),(char)((some-u-value&0x0000FF00)>>8),(char)((some-u-value&0x000000FF)>>0)};