1

我怎么能在 C++ 中做到这一点?在 python 中是

example = [u'one', u'two', u'three', u'four']
print example[1:3]

我怎么能在 C++ 中做到这一点(我缺少这个函数)我需要将它重写为 C++

while i<len(a)-1:
                if (a[i]=='\x00' or a[i]=='\x04') and (eval("0x"+(a[i-1].encode("hex"))) in range(32-(4*eval((a[i].encode("hex")))),128-(12*eval((a[i].encode("hex")))))):
                    st+=a[i-1:i+1]
                    i+=2;continue
                elif st=='':
                    i+=1;continue
                elif len(st)>=4 and (a[i-1:i+1]=='\x00\x00' or a[i-1:i+1]=='\x0a\x00' or a[i-1:i+1]=='\x09\x00' or a[i-1:i+1]=='\x0d\x00'):
                    s.STRINGS.append([st.decode("utf-16le"),0xffffff])
                    s.INDEX.append(iCodeOffset+i-1-len(st))
                    st=''
                    i=i-1;continue
                else:
                    st=''
                    i=i-1;continue

我需要二进制文件中的字符串列表而不使用 string.exe

THX for Advance Benecore

4

2 回答 2

0

首先,在 C++ 中没有直接的替代品,因为 C++ 不是 python,并且有自己的习惯用法,它们的工作方式不同。

首先,对于字符串,您可以使用特定的std::string::substr.

对于更通用的容器,您应该知道 C++ 通常在对所述容器的元素进行操作时基于迭代器工作。例如,假设您想比较向量中的元素,您将执行以下操作:

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> a = {1,2,3,4};
    std::vector<int> b = {1,2,10,4};
    std::cout << "Whole vectors equal? " << (std::equal(a.begin(), a.end(), b.begin())?"yes":"no") << std::endl;
}

现在,假设我们只想比较前两个值(如[:2]),那么我们会将最后一条语句重写为如下所示:

std::cout << "First 2 values equal? " << (std::equal(a.begin(), a.begin()+2, b.begin())?"yes":"no") << std::endl;

假设我们想比较最后两个值,我们会这样做:

std::cout << "Last 2 values equal? " << (std::equal(a.end()-2, a.end(), b.begin())?"yes":"no") << std::endl;

看到出现的模式了吗?x.begin()+i,x.begin()+j大致等于[i:j]x.end()-i,x.end()-j)大致等于[-i,-j]。请注意,您当然可以混合使用这些。

因此,通常在处理容器时,您将使用一系列迭代器,并且这个迭代器范围可以非常类似于 python 的列表拼接来指定。它更冗长,它是另一个习惯用法(拼接列表又是列表,但迭代器不是容器),但你会得到相同的结果。

一些最后的笔记:

  • 我写x.begin()是为了让代码更清晰一点,你也可以写std::begin(x),它更通用,也适用于数组。这同样适用于std::end
  • 在为迭代器编写自己的 for 循环之前,请查看算法库。
  • 是的,您可以编写自己的 for 循环(类似于for(auto it = a.begin(); it != a.end(); it++),但通常将函数或 lambda 传递给std::foreach
  • 真正记住 C++ 不是 python,反之亦然。
于 2012-04-07T15:25:35.527 回答
0

这是一个函数,它返回一个新的拼接向量,然后是旧的。它只做最基本的拼接(从:到),并且只在一个方向上(不确定从是否大于到,但我相信python会反转输出)。

template<typename T>
std::vector<T> splice(const std::vector<T> in, int from, int to)
{
    if (to < from) std::swap(to, from);

    std::vector<T> ret(to - from + 1);

    for (to -= from; to + 1; to--)
    {
        ret[to] = in[from + to];
    }

    return ret;
}
于 2012-04-07T13:17:22.473 回答