0

私の質問の単純さを許してください、私はWindowsのタイプを扱うことに慣れていません。

LPBYTE バッファがあり、その各バイトを別のバイトと XOR したいと考えています。

バッファの長さを取得してC++で反復処理する適切な方法は何ですか? 私は次のようなことをしようとしています:

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

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

どうもありがとう!

4

2 に答える 2

3

C(/C++)のLPBYTEバッファーはメモリ内のどこかのアドレスにすぎないため、できればサイズ値を使用して明示的な方法でそのバッファーの長さを追跡する必要があります。

例えば

// 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;
于 2012-01-01T22:32:31.330 に答える
2

bufは実際にはの値に割り当てられますが(LPBYTE) LockResource(LoadResource(NULL, hRsrc));、それがnullで終了したかどうかは推測できますか?

リソースのタイプによって異なりますが、おそらくそうではありません。とにかく、リソースを操作しているので、関数を使用してリソースサイズを取得できます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;
于 2012-01-01T22:43:56.883 に答える