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

4

6 回答 6

4

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

x00 x00 x00 x0a   or   x0a x00 x00 x00

取决于处理器的字节序。

打印出零将具有终止输出字符串的效果。

于 2013-07-01T11:00:51.513 回答
3

您没有代码可以明智地打印缓冲区的内容,因此您希望它可以神奇地工作。流的operator <<函数需要一个指向 C 风格字符串的指针,而缓冲区不是。

于 2013-07-01T10:58:53.413 回答
1

这是""因为int iPacket_number可能在内存中布置为:

0x00 0x00 0x00 0x0a

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

首先,您可能需要某种编组,以便在线表示得到很好的建立和便携(想想平台之间的字节序差异)。

其次,您不需要“打印”结果字符串;这没有道理。

第三,你想要unsigned char,而不是(签名)char

于 2013-07-01T11:01:06.333 回答
0

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

于 2013-07-01T11:01:00.480 回答
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;
于 2013-07-01T11:07:29.757 回答
0

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

std::cout<<"Buffer = "; for each (auto c in buffer)
{
    std::cout<< c; 
} 
std::cout <<"END";
于 2013-07-01T11:07:42.180 回答