2012-02-03 80 views
1

我有一個字符數組的對象;前5個字節(C++中的char)是附加數據,之後的所有內容都是字符串消息。從字符串開始索引到結束字符陣列

所以我的問題是我怎麼能從索引5開始到最後一個字節?

我知道有memccpy,但它需要一個結束字符,我不能預先知道。 我知道在C++中有一個字符串對象,但想法是來回發送一個包含數據和消息的字節數組。所以從某種意義上說,我來回序列化和反序列化。

有什麼建議嗎?

編輯:

Packet * Packet::create(byte const data[]) 
{ 
    //Concat all first 4 byte values to a uint32 
    unsigned int length = data[0] << 32 | data[1] << 16 | data[2] << 8 | data[3] << 0; 

    //4th element is packet type 
    PacketType type = (PacketType)data[4]; 

    string packetData; 

    packetData.clear(); 
    char * cdata; 
    //Check packet data is present 
    if(sizeof(data) > 5) 
    { 
     //string s((char)data); 
     //packetData = s.substr(4, s.length() - 4); 
     strncat(cdata,data+5,sizeof(data)-5); 
     packetData.append(cdata); 
    } 

    //Create new packet; 
    Packet * packet = new Packet(length,type,packetData); 

    return packet; 
}; 

它不會接受數據[],甚至當我將它轉換爲char。 參數不是一個指針?

編輯::

Packet * Packet::create(char const * data) 
{ 
    //Concat all first 4 byte values to a uint32 
    unsigned int length = data[0] << 32 | data[1] << 16 | data[2] << 8 | data[3] << 0; 

    //4th element is packet type 
    PacketType type = (PacketType)data[4]; 

    //Set packet data, if available 
    string packetData = (sizeof(data) > 5) ? string(data+5):""; 

    Packet * packet = new Packet(length,type,packetData); 
    return packet; 
}; 

我還是要考這個,但是我不得不用炭,我怎麼用我自己的typedef在這種情況呢?

而且之間有什麼 區別「的char *數據」 和 「CHAR數據[]」

我認爲數組和指針是同一個東西。

+0

使用:'strncpy'或'strcpy',並且數組在內存中是連續的,所以只需使用'(source + 5)'作爲源緩衝區,以確保從源字符數組中的第5個字符複製。 – 2012-02-03 09:47:41

+1

如果您可以將您的消費者更改爲接受開始/結束對,則根本不需要進行任何複製... – 2012-02-03 10:08:25

+0

'sizeof(data)'錯誤。它會給你指針的大小,而不是它指向的C字符串的長度。改用'strlen(data)'。 – jrok 2012-02-03 11:10:44

回答

0

您剛纔提到「知道有memccpy,但它需要一個結束字符,這是我不能事先知道」。這是否意味着您的序列化數據既沒有數據大小也沒有分隔符?如果沒有,你怎麼預期 「string packetData =(sizeof(data)> 5)?string(data + 5):」「;」 工作? 對於序列化,您可以在標題中發送數據的大小。然後使用簡單的memcpy。

0

使用strcpycharArray + 5作爲源參數。

你也應該知道strlen它給你的字符串的長度[可能需要分配char[],如果沒有已知的上限]。

編輯:代碼卡:

#include <iostream> 
#include <cstring> 
using namespace std; 
int main() { 
    char in[] = "XXXXXqwerty"; 
    //dynamic allocation using strlen() if you don't have upper bound for in 
    char* out = new char[strlen(in) - 4]; 
    strcpy(out,in+5); 
    cout << out; 
    delete[] out; 
    return 0; 
} 
相關問題