c++如何获取字节BYTE的长度?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++如何获取字节BYTE的长度?相关的知识,希望对你有一定的参考价值。
c++如何获取字节BYTE的长度?
如:BYTE buf=(BYTE)"CETest";
我怎么获取buf的长度呢?
还有怎么把BYTE类型转换为char*指针类型呢?
如 char* ch;
如果把buf的值赋给ch呢?
请教了,我QQ是:523716390。
为什么我把BYTE类型字节要输出到控制台时,得到的并不是我要的字节呢?如一个方法:void WriteCOM(BYTE *buf, DWORD bufLen)
DWORD dwNumBytesWritten;
DWORD dwHaveNumWritten=0;
iWrite++;
int iInc=0;//如果3次写入不成功,返回
do
if(WriteFile(hComm,/*串口句柄*/
buf+dwHaveNumWritten,/*被写入数据缓冲区*/
bufLen-dwHaveNumWritten,/*被写入数据缓冲区大小*/
&dwNumBytesWritten,/*函数执行后,返回实际向串口写的字个数*/
NULL))
dwHaveNumWritten=dwHaveNumWritten+dwNumBytesWritten;
//写入完成
if(dwHaveNumWritten==bufLen)
cout<<"Written "<<iWrite<<":"<<&buf<<endl;
break;
iInc++;
if(iInc>=3)
return ;
Sleep(10);
while(TRUE);
其中:cout<<"Written "<<iWrite<<":"<<&buf<<endl;这里输出的不是我传入参数的字节"CETest"。
比如我调用方法
BYTE buf=(BYTE)"CETest";
char chBuf=buf;
WriteCOM(&buf,strlen(&chBuf));
而输出的是:001AFB10这好像是十六进制的,请问是怎么回事呢
typedef unsigned char BYTE
所以取赋值“CETest”给buf,buf的内容是'C','E','T','e','s','t','\0'的长度,直接使用for循环
来计算,或使用strlen函数获取后加一(加上'\0')就可以得到其长度。
赋值的话,这样就可以:ch = (char*)buf; 参考技术A BYTE buf=(BYTE)"CETest";导致了数据丢失,应该为BYTE *buf=(BYTE*)"CETest"。
strlen(buf)获得长度。 参考技术B 每次读取byte[]数组长度个字节。也就是说,你byte数组长度多少。就读取多少到byte数组里
如何在 C++ 中遍历 LPBYTE 的每个字节
【中文标题】如何在 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;
非常感谢!
【问题讨论】:
LPBYTE
与 unsigned 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++如何获取字节BYTE的长度?的主要内容,如果未能解决你的问题,请参考以下文章