[英]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.