簡體   English   中英

如何將byte []復制到char *中?

[英]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#編寫的:(

在這里出問題了:

  1. ddj不指向任何實際內存。 因此,副本將具有未定義的行為
  2. 首先不需要復制。

您可以執行以下操作:

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;
}

您沒有為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM