2012-01-01 14 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'が指し示すデータがヌル文字で終わらない限り(そしてそれは確かに「文字列のようなデータ型」を叫ばないでください)、それがどれくらい長いかを発見する方法はありません。 –

答えて

2

それがnullで終了だ場合bufが実際に(LPBYTE) LockResource(LoadResource(NULL, hRsrc));の値は、いずれかの推測に割り当てていますか?

リソースのタイプにもよりますが、ほとんどの場合はありません。とにかく、リソースを使って作業しているので、SizeofResource関数を使用してリソースサイズを取得できます。

LockResourceによって返されたものに書き込むことができるかどうかはまだ分かりません(実際には、メモリマップされた実行可能ファイルの領域であるリソースを含む領域へのポインタを返します)。おそらく、XORする前に他の場所にコピーしたいと思うでしょう。

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++)のバッファはメモリのどこかのアドレスなので、そのバッファの長さを、好ましくは明示的にサイズの値をとっておく必要があります。

など。

// 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; 
関連する問題