2013-07-01 50 views
0
#define ECHOMAX 100 

struct tDataPacket 
{ 
    int iPacket_number; 
    char sData[ECHOMAX]; 
}; 

int main() { 
    tDataPacket packet; 
    packet.iPacket_number=10; 
    strcpy(packet.sData,"Hello world"); 
    char buffer[sizeof(tDataPacket)]; 

    memcpy(buffer,&packet.iPacket_number,sizeof(int)); 
    memcpy(buffer+sizeof(int),packet.sData,ECHOMAX); 

    std::cout<<"Buffer = "<<buffer<<"END"; 
    return 0; 
} 

在上面的代碼中,我嘗試將結構打包在char []緩衝區中,以便我可以將它發送到UDP套接字。但是程序的輸出是「」字符串。所以沒有什麼是複製到'緩衝區'。我錯過了什麼?使用memcpy試圖將一個結構複製到char []緩衝區中

+0

當您複製int時,緩衝區的第一個(sizeof(int))字符中的至少一個將爲零,這將終止字符串輸出。 – icabod

+0

@Joachim Pileborg, 實際上,在這段代碼中沒有可變長度的數組,因爲所有的數組大小都是常量。 當sizeof(tDataPacket)是常量時,ECHOMAX被定義爲常量,因爲sizeof的結果類型是編譯時常量,而不管它的參數如何。 –

+0

@rasen你說得對,一定有誤讀。 –

回答

3

你沒有合理的打印緩衝區內容的代碼,所以你期望這個功能可以通過魔法工作。流的operator <<函數需要一個指向C風格字符串的指針,而緩衝區不是。

+0

我已經把std :: cout在那裏?不會工作? –

+0

@SoumyajitRoy因爲你所擁有的不是一個字符串,而是用'char'緩衝區僞裝的結構的字節表示。 ***想一想*** – 2013-07-01 11:01:37

+0

@SoumyajitRoy它將'char []'緩衝區解釋爲一個[null terminated string](http://en.wikipedia.org/wiki/Null-terminated_string)。所以它會打印字符,直到找到一個「0」。它看起來像第一個元素是'0'。 – juanchopanza

4

當您複製int時,緩衝區的第一個「n」個字符中的至少一個將爲零(其中「n」是平臺上int的大小)。例如對於一個4字節的int:

x00 x00 x00 x0a or x0a x00 x00 x00 

取決於處理器的字節順序。

打印零將會產生終止輸出字符串的效果。

0

您不能將整數作爲文本打印,因爲它不是文本。

1

這是因爲""int iPacket_number內存可能是佈局爲:

0x00 0x00 0x00 0x0a 

這是一個空字符串(nul終止子的第一個字符)。

首先,您可能需要某種編組方式,以便線上表示形式良好並且可移植(思考平臺之間的端差)。

其次你不需要「打印」結果字符串;這個不成立。

第三你想要unsigned char,沒有(簽名)char

0

你需要做一個循環(或類似的東西)來打印緩衝區的實際內容:

std::cout << "Buffer="; 
for(size_t i = 0; i < sizeof(tDataPacket); i++) 
{ 
    std::cout << hex << (unsigned int)buffer[i] << " "; 
    if ((i & 0xf) == 0xf) std::cout << endl; // Newline every 16. 
} 
std::cout << "END" << endl; 
0

你可以做到這一點,但它不是真正相關的顯示這樣的二進制數據:

std::cout<<"Buffer = "; for each (auto c in buffer) 
{ 
    std::cout<< c; 
} 
std::cout <<"END"; 
相關問題