[英]How to copy a byte[] into a char*?
我需要的只是strcpy()。
我想查看缓冲区(字节数组)的前三个字节是否为字符串的“ JMX”。
这是我到目前为止所做的:
char * ddj;
strcpy( ddj, buffer ); //buffer is BYTE[]
if ( strcmp( "JMX", ddj ) == 0 ) //check first three chars are "JMX"
{
buffer += 20; //increase the index with 20
size -= 20; //int
}
我在strcmp()行遇到异常。 问题是什么?
我希望我是用C#编写的:(
您没有为ddj
分配任何内存。 由于它是一个局部变量,因此它是在堆栈上分配的。 默认情况下,局部变量未初始化为0 / false / NULL,因此ddj
声明后的值是未定义的-它的值将保留在堆栈上特定位置的内存中。 任何取消引用它的尝试(即读取或写入它所指向的内存)都将具有未定义的行为。 在您的情况下,它崩溃是因为它指向一个无效的地址。
要解决此问题,您需要为ddj
分配存储。 您可以在堆栈上分配静态存储,也可以在堆上分配动态存储。 要分配静态存储,请执行以下操作:
// Allocate 64 bytes for ddj. It will automatically be deallocated when the function
// returns. Be careful of buffer overflows!
char ddj[64];
分配动态存储:
// Allocate 64 bytes for ddj. It will NOT be automatically deallocated -- you must
// explicitly deallocate it yourself at some point in the future when you're done
// with it. Be careful of buffer overflows!
char *ddj = new char[64];
...
delete [] ddj; // Deallocate it
与其亲自管理存储,不如使用std::string
,它会自动处理内存管理,这是一个更好的主意。
最后,由于您要做的只是比较字符串的前三个字符,因此无需跳过箍来复制字符串并进行比较。 只需使用strncmp()
:
if(strncmp(buffer, "JMX", 3) == 0)
{
...
}
您尚未为ddj分配内存。 使用new分配内存。 例如
char *ddj = new char[size]; //Allocate size number of chars
//do the required comaprisons
delete[] ddj; //Remember to release the memory.
另一方面,您可以使用std :: string这是一个标准的字符串类。
您必须为ddj
分配新的内存。 要么声明为
char ddj[NAX_LENGTH];
或动态分配
char* ddj = new char[length]; // You must use delete[] to free the memory in the end.
一个更方便的替代方法是std::string
。
首先,它崩溃是因为ddj
没有指向任何东西。
其次,您不需要将数据从byte []复制到char *(它们本质上是相同的)。 您可以这样做:
if (strncmp("JMX", reinterpret_cast<char*>(buffer), 3) == 0)
{
// Strings are equal, do what you want
}
这是UB,因为ddj
没有指向任何东西。 您需要分配内存:
char* ddj = new char[strlen(buffer) + 1];
一定要delete
您使用分配的内存delete[]
非纯delete
!)。
您也可以使用std::string
,这通常是安全的,因为您不必处理指针和内存分配。
然而, ddj
您的代码, ddj
似乎没用。 只需使用buffer
:
if ( strcmp( "JMX", buffer ) == 0 ) //check first three chars are "JMX"
{
buffer += 20; //increase the index with 20
size -= 20; //int
}
如果要strcmp ddj,也可以先在缓冲区上进行操作,如果以后需要,可以制作缓冲区的副本。
由于未初始化变量'ddj',因此您正在获取异常。 它指向垃圾,所以谁知道您要将字符串复制到哪里...
不过,在比较它们之前,您实际上并不需要复制字节。
if(strncmp("JMX", buffer, 3) == 0) // check if the first three characters are "JMX"
{
buffer += 20;
size -= 20;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.