2012-04-07 2 views
0

C++에서 어떻게 할 수 있습니까? 파이썬에서 내가 C++에서 내가 문자열을 사용하지 않고 C++C++ 배열 [from : to]

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 

내가 바이너리 파일에서 문자열 목록을 필요로이 다시 필요 (난이 기능 누락) 그렇게 할 수있는 방법

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

입니다. EXE

THX 사전에 대한 Benecore 여기

+0

질문을 C++ 커뮤니티에 보내려고하기 때문에 파이썬 프로그램이 무엇을하는지, 그리고 C++로 변환하려고 시도한 것과 어려움이 무엇인지 설명하십시오. – Mahesh

답변

0

새로운 접합 벡터 승기를 반환하는 함수입니다 그때 오래된 것. 그것은 가장 기본적인 스플 라이스 (from :), 오직 한 방향으로 만 (파이썬이 출력을 반전한다고 믿지만 from은 크지 만 확실하지는 않습니다). C++ 파이썬하지 않고 다르게 작동 자신의 관용구를 가지고로 우선

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; 
} 
0

은 C++에서 이에 대한 즉각적인 교체가 없다.

먼저 문자열의 경우 std::string::substr을 사용할 수 있습니다.

더 일반적인 컨테이너의 경우 C++은 일반적으로 컨테이너의 요소를 조작 할 때 반복기 기반으로 작동한다는 것을 알아야합니다. 예를 들어 다음과 같이 할 거라고, 당신이 벡터의 요소를 비교하려는 생각 : 우리가 첫 번째 두 값 ([:2] 등) 비교한다고 가정 지금

#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; 
} 

을, 그리고 우리는 다시 작성 것이다

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]과 같습니다. 물론 이들을 혼합 할 수 있습니다.

일반적으로 컨테이너 작업을 할 때 일련의 반복자에 대해 작업 할 것이고이 반복자 범위는 파이썬의리스트 접합과 매우 비슷하게 지정할 수 있습니다. 좀 더 자세한 정보이며 다른 관용어입니다 (스플 라이스 된 목록은 목록이지만 반복자는 컨테이너가 아닙니다). 그러나 동일한 결과를 얻습니다.

일부 최종 노트 :

  • 나는, 당신은 또한 더 일반적인 인 std::begin(x)을 쓸 수있는 비트 명확하게 코드를 만들기 위해 x.begin()을 썼다 또한 배열에서 작동합니다. 같은 일이 일어납니다 std::end
  • 이터레이터에 루프를 작성하기 전에 the algorithms library을 살펴보십시오.
  • 예 당신은 루프 (for(auto it = a.begin(); it != a.end(); it++)처럼 뭔가를 직접 작성할 수 있지만, 자주는
  • std::foreach 정말 C++는 그 반대의 경우도 마찬가지 파이썬되지 않았거나 기억에 함수 또는 람다를 전달하는 데 더 쉽고 일관성입니다.
+0

예 C++은 Python이 아니지만 Python에서는 바이너리 파일에서 문자열을 추출/편집 할 수있는 응용 프로그램을 작성하지만 wxPython에 쓰기 때문에 12 MB가 있기 때문에 C++로 다시 작성해야하지만 찾을 수는 있습니다. 이진 파일에서 문자열을 추출하는 예제. 문자열 목록. – Benecore

+0

@Benecore 그것은 파이썬의 범위 연산자를 C++로 표현하는 것과는 전혀 다른 질문입니다. – KillianDS

+0

예,하지만 바이너리 파일에서 문자열을 추출하는 스크립트가 있는데 다시 작성하고 싶지만 배열의 인덱스를 다시 쓸 수 있다는 것을 모릅니다. @@@@ – Benecore