请原谅我的问题的简单性,我不习惯使用Windows类型。
我有一个LPBYTE缓冲区,我希望用另一个字节对它的每个字节进行异或。
获取缓冲区长度并在C ++中迭代它的正确方法是什么?我正在尝试做类似的事情:
LPBYTE buf = *something*;
char key = 'X';
for(int i=0;i<len(buf);i++)
buf[i] = buf[i] ^ key;
非常感谢!
答案 0 :(得分:3)
C(/ C ++)中的LPBYTE
缓冲区只是内存中的某个地址,因此您需要通过具有大小值来明确地跟踪该缓冲区的长度。
E.g。
// 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;
答案 1 :(得分:2)
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;