0

请原谅我的问题很简单,我不习惯使用 Windows 类型。

我有一个 LPBYTE 缓冲区,我希望将它的每个字节与另一个字节进行异或。

获取缓冲区长度并在 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));,如果它是空终止的,有什么猜测吗?

取决于资源的类型,但很可能不是。无论如何,由于您正在使用资源,因此您可以使用该SizeofResource函数获取资源大小。

不过,我不确定你是否可以写返回的东西LockResource(它实际上返回一个指向包含资源的区域的指针,这可能只是内存映射可执行文件中的一个区域)。很可能您希望在异或之前将其复制到其他地方。

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 回答