如何在 C++ 中遍历 LPBYTE 的每个字节

Posted

技术标签:

【中文标题】如何在 C++ 中遍历 LPBYTE 的每个字节【英文标题】:How to iterate through each byte of an LPBYTE in C++ 【发布时间】:2012-01-01 22:11:50 【问题描述】:

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

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

在 C++ 中获取缓冲区长度并遍历它的正确方法是什么?我正在尝试做类似的事情:

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

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

非常感谢!

【问题讨论】:

LPBYTEunsigned char * 相同,以防万一。 一个LPBYTE 指向一个缓冲区。 除非LPBYTE 指向的数据是空终止的(而且它肯定不会叫出“类似字符串的数据类型”),否则没有办法发现多长时间了。 所以如果它的 null 终止我可以用 strlen 得到长度? buf 实际上是分配给 (LPBYTE) LockResource(LoadResource(NULL, hRsrc)); 的值,如果它是空终止的,有什么猜测吗? 在过去的几周里,有很多关于异或“加密”的问题。非常典型的期末项目。有用性为零,它只不过是一个被频率计数轻易破解的凯撒密码。你有没有考虑和你的同学会面来敲定这件事?令人难以置信的有用的真实世界经验,作为一个团队一起工作。当你得到一份真正的工作时非常重要。在 SO 中没有很好地建模,这是一个答案,而不是实践的地方。 【参考方案1】:

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;

【讨论】:

【参考方案2】:

buf 实际上是分配给(LPBYTE) LockResource(LoadResource(NULL, hRsrc)); 的值,你猜猜它是否以null 结束?

取决于资源的类型,但很可能不是。无论如何,由于您正在处理资源,因此您可以使用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;

【讨论】:

以上是关于如何在 C++ 中遍历 LPBYTE 的每个字节的主要内容,如果未能解决你的问题,请参考以下文章

如何轻松将 LPBYTE 转换为 char[256](用于从 Windows 注册表读取文本)

读取二进制文件并遍历每个字节

如何遍历字符串并检查每个字符的字节值?

c++如何获取字节BYTE的长度?

编组 LPBYTE

如何访问位图图像中的每个字节