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

C++ 使用memcpy尝试将一个结构复制到char[]缓冲区,c++,c,C++,C,在上面的代码中,我试图将我的结构打包到char[]缓冲区中,以便将其发送到UDP套接字。但是程序的输出是字符串。因此,没有任何内容被复制到“缓冲区”。我遗漏了什么吗???您没有代码可以合理地打印缓冲区的内容,所以您希望这会神奇地起作用。复制int时,缓冲区的前n个字符中至少有一个将为零,其中n是平台上int的大小。例如,对于4字节整数: #define ECHOMAX 100 struct tDataPacket { int iPacket_number; char sData

在上面的代码中,我试图将我的结构打包到char[]缓冲区中,以便将其发送到UDP套接字。但是程序的输出是字符串。因此,没有任何内容被复制到“缓冲区”。我遗漏了什么吗???

您没有代码可以合理地打印缓冲区的内容,所以您希望这会神奇地起作用。复制int时,缓冲区的前n个字符中至少有一个将为零,其中n是平台上int的大小。例如,对于4字节整数:

#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;
}
取决于处理器的端度


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

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

这是因为int-iPacket\u编号可能在内存中以如下方式排列:

x00 x00 x00 x0a   or   x0a x00 x00 x00
它是第一个字符中的空字符串nul终止符

首先,您可能需要某种编组,以便在线表示得到很好的建立,并且可以移植平台之间的端点差异

其次,不需要打印结果字符串;这毫无意义


第三,您需要的是无符号字符,而不是有符号字符。

您需要执行循环或类似操作来打印缓冲区的实际内容:

0x00 0x00 0x00 0x0a

您可以这样做,但这样显示二进制数据并不重要:

 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;

复制int时,缓冲区的前一个sizeofint字符中至少有一个为零,这将终止字符串输出。@Joachim Pileborg,实际上此代码中没有可变长度数组,因为所有数组大小都是常量。当sizeoftDataPacket为常量时,ECHOMAX被定义为常量,因为sizeof的结果类型是编译时常量,而不管它的参数是什么。@rasen您是对的,一定是误读了。@SoumyajitRoy,因为您拥有的不是字符串,而是隐藏在字符缓冲区中的结构的字节表示形式。想想看。@SoumyajitRoy它将char[]缓冲区解释为。所以它会打印字符,直到找到一个0。看起来第一个元素是0。@SoumyajitRoy:不,它不起作用。它不知道输出缓冲区的合理方式是什么。怎么可能呢?输出由一个整数和一个字符串组成的结构的代码在哪里?该代码不存在,因此期望它发生是不合理的。
std::cout<<"Buffer = "; for each (auto c in buffer)
{
    std::cout<< c; 
} 
std::cout <<"END";