使用memcpy尝试将一个结构复制到char []缓冲区

时间:2013-07-01 10:56:49

标签: c++ c

#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套接字。但程序的输出是“”字符串。因此没有任何东西被复制到'缓冲区'。我错过了什么吗?

6 个答案:

答案 0 :(得分:4)

复制int时,缓冲区的第一个“n”字符中至少有一个为零(其中“n”是平台上int的大小)。例如,对于4字节的int:

x00 x00 x00 x0a   or   x0a x00 x00 x00

取决于处理器的字节顺序。

打印出零将产生终止输出字符串的效果。

答案 1 :(得分:3)

你没有代码可以合理地打印缓冲区的内容,所以你希望这可以通过魔法来工作。流的operator <<函数需要一个指向C风格字符串的指针,缓冲区不是。

答案 2 :(得分:1)

它是"",因为int iPacket_number可能在内存中列为:

0x00 0x00 0x00 0x0a

这是一个空字符串(nul - 第一个字符中的终结符。)

首先,您可能需要进行某种编组,以便线上表示已经很好地建立并且可移植(想想平台之间的字节差异)。

其次,您不需要“打印”生成的字符串;没有意义。

第三,您需要unsigned char,而不是(签名)char

答案 3 :(得分:0)

您不能将整数打印为文本,因为它不是文本。

答案 4 :(得分: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;

答案 5 :(得分:0)

你可以这样做,但它与显示这样的二进制数据并不相关:

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