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