gpt4 book ai didi

c++ - 将 float 数组转换到 char* 或从 char* 转换并通过网络发送

转载 作者:太空宇宙 更新时间:2023-11-04 13:42:22 24 4
gpt4 key购买 nike

这就是我到目前为止所做的一切:

struct HeadPacket
{
int type;
};

struct ReceivePacket
{
// Header
HeadPacket Head;
// Raw Data
char* buffer;
};
struct MovePacket
{
// Header
HeadPacket Head;
// Raw Data
float X;
float Y;
};
struct ClientsPacket
{
// Header
HeadPacket Head;
// Raw Data
int Clients;
float* X;
float* Y;
};

这些是我拥有的一些示例数据包。

首先我创建一个数据包,将其转换为 char* 并发送。

MovePacket m;
m.Head.type = 2;
m.X = X;
m.Y = Y;
this->Socket->Send(this->Socket->GetAddress(), (char*)&m, sizeof(m));

在另一边我收到它:

char packet[256]; //max size of a packet
SOCKADDR_IN server;
this->Socket->Receive(packet, 256, &server);

现在我将它转换为一个数据包以读取类型,然后我进一步转换它

    ReceivePacket* rec = (ReceivePacket*)packet;
switch (rec->Head.type)
{
case 0:
{
MovePacket* move = (MovePacket*)rec;
}
break;
case 1:
{
ClientsPacket* c = (ClientsPacket*)rec;
}
break;
}

如果我发送和接收 MovePacket,一切正常。

但是,如果我发送一个具有 float 组的 ClientsPacket,则 float 组永远不会包含正确的值。

    ClientsPacket c;
c.Head.type = 3;
c.Clients = clients.size();
c.Y = new float[clients.size()];
c.X = new float[clients.size()];

int size = sizeof(c.Head) + sizeof(int)+((sizeof(float)*clients.size()) * 2);
for (unsigned int i = 0; i < clients.size(); i++)
{
c.X[i] = clients[i].X;
c.Y[i] = clients[i].Y;
printf("X: %f Y: %f\n", c.Y[i], c.X[i]);
}
rc = sock.Send(newclient.GetAddr(), (char*)&c, size);

您知道如何修复它吗?我在哪里可以进一步阅读它为什么会发生,或者您能向我解释为什么会发生吗?

最佳答案

它真正应该是什么样子:服务器:

  ClientsPacket c;
c.Head.type = 3;
c.Clients = clients.size();
c.X = new float[clients.size()];
c.Y = new float[clients.size()];
//define sizes
int fsize = (sizeof(float)*clients.size());
int hsize = sizeof(c.Head) + sizeof(c.Clients);
int size = hsize + sizeof(float)+(fsize*2);
//define sendchar
char* buffer = new char[size];
//fill arrays
for (unsigned int i = 0; i < clients.size(); i++)
{
c.X[i] = clients[i].X;
c.Y[i] = clients[i].Y;
printf("X: %f Y: %f\n", c.X[i], c.Y[i]);
}
//copy memory from client
memcpy(buffer, &c, hsize);
memcpy(buffer + hsize, c.X, fsize);
memcpy(buffer + hsize + fsize, c.Y, fsize);

客户:

ClientsReceivePacket* cv = (ClientsReceivePacket*)rec;

ClientsPacket c;
memcpy(&c.Head, packet, sizeof(c.Head));
memcpy(&c.Clients, packet + sizeof(c.Head), sizeof(c.Clients));
c.X = new float[cv->Clients];
c.Y = new float[cv->Clients];
//define sizes
int hsize = sizeof(c.Head) + sizeof(c.Clients);
int fsize = (sizeof(float)*c.Clients);
//copy content into float array
memcpy(c.X, packet + hsize, fsize);
memcpy(c.Y, packet + hsize + fsize, fsize);

关于c++ - 将 float 数组转换到 char* 或从 char* 转换并通过网络发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27306438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com