【问题标题】:How to find an integer inside a string representing a binary file如何在表示二进制文件的字符串中查找整数
【发布时间】:2016-11-02 11:12:13
【问题描述】:

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

例如,

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(???);

我需要知道some_value在字符串中的位置。

我该怎么做?

现在我正在使用以下解决方案

std::ostringstream some_value_sstr;
some_value_sstr << std::hex << some_value;

std::ostringstream tmp;
for (std::size_t i = 0; i < 4; ++i)
{
  tmp << (char)std::stoi(some_value_sstr.str().substr(i * 2, 2), 0, 16);
}
std::cout << std::hex << pe_file_content.find(tmp.str()) << std::endl;

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

【问题讨论】:

  • 你的意思是像this?小心字节序。我也不知道std::string 是否是二进制数据的最佳选择...
  • @Simon Kraemer 好吧,是的。但我已经有一个DWORD 变量
  • 您搜索的总是DWORD

标签: c++


【解决方案1】:

如果pe_file_content 包含四个字节0x240x3E0x0C0x10,而不是将它们表示为字符的八个字节,那么您需要将您的DWORD 值转换为包含相同字节的字符串,然后您可以搜索:

std::string needle(reinterpret_cast<const char*>(&some_value), sizeof(some_value));
pe_file_content.find(needle);

注意字节顺序。如果您文件中的整数与您的机器的字节序不同,则需要在搜索之前反转some_value 的字节顺序。

【讨论】:

  • 这样使用reinterpret_cast安全吗?
  • 这正是reinterpret_cast 存在的情况。严格的别名规则明确规定了通过char* 引用任何对象的例外情况。
  • 如果您只使用DWORD(4 字节值),您也可以手动进行转换:std::string some_value_str = {{ (char)((some_value &amp; 0xFF000000) &gt;&gt; 24), (char)((some_value &amp; 0x00FF0000) &gt;&gt; 16), (char)((some_value &amp; 0x0000FF00) &gt;&gt; 8), (char)((some_value &amp; 0x000000FF) &gt;&gt; 0) }};
【解决方案2】:

我猜你可以使用相同的方法here 将 DWORD 转换为字符串流并使用 string::find 函数来查找数字的位置。

【讨论】:

  • 你的意思是这样的? std::ostringstream oss; oss &lt;&lt; some_value; pe_file_content.find(oss.str()); 它不会按预期工作
猜你喜欢
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 2021-12-01
  • 2012-06-21
  • 2018-08-03
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
相关资源
最近更新 更多