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