【问题标题】:Very slow function非常慢的功能
【发布时间】:2014-11-05 07:12:04
【问题描述】:

strtol 对我的程序来说非常慢,我希望它非常快

所以例如我有这个字符串:

PCHAR ex = "\x55\xEC" etc...

它们是十六进制的,所以如果我想在没有“\x”的情况下写成“55 EC”等。我必须使用 strtol,但 strtol 对我的程序来说非常慢,我想要最快的在我的节目中..

I use strtol like (CHAR)strtol(ex, &ex, 16);

介意帮帮我吗?

【问题讨论】:

  • 你想做什么?显示没有 0x 前缀的数组?
  • 这对你有用吗?当ex 是一个数组时,将&ex 作为第二个参数传递是没有意义的。
  • 哦,对不起,它是PCHAR ex = "\x55\xEC"; 所以我想做的是:输入没有 \x 的十六进制字符,所以它会是:PCHAR ex = "55 EC" 然后使用 strtol 的 alt 将其更改为\x55\xEC
  • 如果我现在理解了你的问题,我想你可以通过首先将文本模式转换为二进制并像以前一样使用二进制进行模式匹配来加快你的程序。
  • 所以我会将“55 EC”转换为二进制并继续?但它是否仍然与将“55 EC”转换为二进制而不将“55 EC”转换为“\x55\xEC”相同?

标签: c++ strtol


【解决方案1】:

我会这样做:

unsigned long ex[] {0x55, 0xEC};

  for (auto i : ex)
    std::cout << std::hex << i << " ";

输出为:55 EC

【讨论】:

  • 你误会了,我想要像“55 EC”这样的输入并将其转换为 0x55 并将 EC 转换为 0xEC strtol 是正确的,但它真的很慢,需要 6 秒或 5 秒才能得到它, 虽然我希望它真的很快
  • @Frought:不,你错了:你的问题中的输入是“\x55\xEC”,而不是“55 EC”。这些字符串完全不同,实际上是一个不同的问题。 char ex[] {0x55, 0xEC, 0};char ex[] = "\x55\xEC"; 相同
  • 关于 strtol 需要 5 到 6 秒,您可以为我们提供一个工作示例来说明这一点。这将有助于发现问题。
  • 我在我的模式查找器功能(也称为签名查找器)中这样做:privatepaste.com/f19f997e61/5000 pasetkey 是 5000 CC 是通配符,所以用法是:FindSignature("55 EC CC A1", baseAddress, size, mLength); 而不是:FindSignature("\x55\xEC\xCC\A1", baseAddress, size, mLength); 对我的模式进行基准测试使用 strtol 大约需要 6 ~ 5 秒,而没有 strtol(使用 \x55etc..)大约需要 200 毫秒
  • 所以你实际上并没有错,但很不清楚。我想我们大多数人都不明白您想将输入表单“\x55...”更改为“55...”,这无助于获得答案。
【解决方案2】:

你在尝试什么? strtol 将字节字符串转换为长整数;当字符串以0x 作为前缀时,它将字符串视为十六进制数。它不会将\x55 转换为55。三个假设错误:

  • 它将0x55 转换为55。不,它会将其转换为 85(十进制)
  • 它将转换字符串中的多个数字。不,它只会将字符串中的一个数字转换为 longlong long)
  • 它将采用格式为\x 的十六进制数字。不,这应该是 0x 才能将其识别为十六进制值

你所拥有的根本不是strtol 的用例。您必须手动进行转换。

您只需用空格查找替换所有\x 并修剪生成的字符串以去除前导空格。

【讨论】:

  • 我想将 55 本身转换为 0x55 ^^
猜你喜欢
  • 2014-10-19
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 2021-05-24
  • 2010-10-24
  • 2020-07-30
  • 1970-01-01
  • 2014-06-05
相关资源
最近更新 更多