如何将byte []复制到char *中?

时间:2009-05-17 17:34:55

标签: c++ c

我所需要的只是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#写这个:(

8 个答案:

答案 0 :(得分:8)

这里出了问题:

  1. ddj没有指向任何实际的记忆。因此,副本将具有未定义的行为
  2. 首先不需要复制。
  3. 这是你可以做的:

    if(strncmp("JMX", buffer, 3) == 0) {
      buffer += 20;
      size -= 20;
    }
    

    这使用strncmp而不是strcmp,从而确保比较不超过三个字节。如果buffer可以包含少于三个字节,则应该执行以下操作:

    if(buf_len >= 3 && strncmp("JMX", buffer, 3) == 0) {
      buffer += 20;
      size -= 20;
    }
    

答案 1 :(得分:6)

您没有为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)
{
    ...
}

答案 2 :(得分:2)

您尚未为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。

答案 3 :(得分:2)

您必须为ddj分配新内存。要么声明为

char ddj[NAX_LENGTH];

或动态分配

char* ddj = new char[length]; // You must use delete[] to free the memory in the end.

更方便的选择是std::string

答案 4 :(得分:1)

首先,它崩溃了,因为ddj没有指向任何东西。

其次,您不需要将数据从byte []复制到char *(它们基本上是相同的)。你可以这样做:

if (strncmp("JMX", reinterpret_cast<char*>(buffer), 3) == 0)
{
  // Strings are equal, do what you want
}

答案 5 :(得分:0)

这是UB,因为ddj没有指向任何东西。你需要分配内存:

char* ddj = new char[strlen(buffer) + 1];

请确保delete使用delete[](而非普通delete分配的内存std::string

您也可以使用通常安全的ddj,因为您不必处理指针和内存分配。

但是,查看您的代码,buffer似乎毫无用处。只需使用if ( strcmp( "JMX", buffer ) == 0 ) //check first three chars are "JMX" { buffer += 20; //increase the index with 20 size -= 20; //int }

{{1}}

答案 6 :(得分:0)

如果你想strcmp ddj,你也可以先在缓冲区上做,然后在需要的时候复制缓冲区。

答案 7 :(得分:0)

您正在获取异常,因为变量'ddj'未初始化。它指向垃圾,所以谁知道你在哪里复制那个字符串...

但是,在比较它们之前,您并不需要复制字节。

if(strncmp("JMX", buffer, 3) == 0) // check if the first three characters are "JMX"
{
    buffer += 20;
    size -= 20;
}