2012-01-01 2 views
0

실례로 내 질문에 단순함을 나타내지 만 Windows 유형에 익숙하지는 않습니다.C++에서 LPBYTE의 각 바이트를 반복하는 방법

나는 LPBYTE 버퍼를 가지고 있고, 나는 그것의 각 바이트를 다른 바이트와 XOR하고 싶다.

버퍼의 길이를 가져 와서 C++에서 반복하는 올바른 방법은 무엇입니까? 나는 다음과 비슷한 것을 시도하고있다 :

LPBYTE buf = *something*; 
char key = 'X'; 

for(int i=0;i<len(buf);i++) 
    buf[i] = buf[i]^key; 

많은 감사!

+3

'LPBYTE'는 도움이 될 경우'unsigned char * '와 동일합니다. –

+0

버퍼에'LPBYTE' _points_가 있습니다. –

+2

'LPBYTE'가 가리키는 데이터가 null로 끝나지 않는 한 (확실히 "문자열과 유사한 데이터 유형"을 외치지는 않는다) 얼마나 오랫동안인지하는 방법은 없습니다. –

답변

2

버피 실제로 (LPBYTE) LockResource(LoadResource(NULL, hRsrc));의 가치에 어떤 추측을 할당한다?

리소스 유형에 따라 다르지만 일반적으로 아니오입니다. 어쨌든, 자원으로 작업 중이므로 SizeofResource 기능을 사용하여 자원 크기를 가져올 수 있습니다.

그래도 LockResource에 의해 반환 된 항목을 쓸 수 있는지 확실하지 않습니다. 실제로 리소스가 포함 된 영역에 대한 포인터를 반환합니다. 이는 메모리 매핑 된 실행 파일의 영역 일뿐입니다. 아마 당신은 그것을 XORing하기 전에 다른 곳에 복사하기를 원할 것입니다.

HGLOBAL resource=LoadResource(NULL, hRsrc); 
if(resource==NULL) 
{ 
    // ... handle the failure ... 
} 
LPBYTE resPtr=LockResource(resource); 
DWORD resSize=SizeofResource(NULL, hRsrc); 
if(resPtr==NULL || resSize==0) 
{ 
    // ... 
} 
std::vector<BYTE> buffer(resPtr, resPtr+resSize); 
// Now do whatever you want to do with your buffer 
for(size_t i=0; i<buffer.size(); ++i) 
    buffer[i]^=key; 
3

LPBYTE C (/ C++)의 버퍼는 메모리의 어딘가에있는 주소이므로 크기 값을 사용하여 명시 적으로 해당 버퍼의 길이를 추적해야합니다.

예. 그이 널 (null) 종료 않다면

// use a struct instead to keep things together  
struct 
{ 
    LPBYTE buffer; 
    size_t size; 

} yourbuffer; 

// init part 
BYTE somewriteabledata[200]; 

yourbuffer.buffer = somewriteabledata; 
yourbuffer.size = sizeof(somewriteabledata); 

char key = 'X'; 

for(int i=0;i<yourbuffer.size;i++) 
    yourbuffer.buf[i] = yourbuffer.buf[i]^key;