gpt4 book ai didi

c++ - 从 tcp 读取 float

转载 作者:可可西里 更新时间:2023-11-01 02:51:36 24 4
gpt4 key购买 nike

我正在尝试读取从 Python tcp 流服务器中的打包结构传递的 big-endian 8 32 位 float 。它似乎接近工作,但前几个值有奇数的偏差,后面的值似乎有少量偏差,或者只是不精确。

例如,这些是客户端解释的值:

Val[0] -1926.34
Val[1] -1936.86
Val[2] -1901.15
Val[3] -1935.93
Val[4] -148932
Val[5] -145905
Val[6] -41580.8
Val[7] -134330

这里是(接近但现在相当)它们应该是的值。这并不完全是真实的,因为很难在服务器和客户端上捕获完全相同的数据包。

Val[0] -7737.77159902711
Val[1] -7746.444075875769
Val[2] -7638.46279841218
Val[3] -7776.037785534595
Val[4] -148935.79768369172
Val[5] -145903.3365134402
Val[6] -41594.9200504923
Val[7] -134328.9103304041

这是我的代码:

int size = 32;
char buffer[size];
float vals[8];
int count = 0;
int t;

// Receive a reply from the server
if (recv(sock, buffer, size, 0) < 0) {std::cout << "Receive failed..." << std::endl;}

for (int i = 0; count < 8; i += 4, count++) {
t =
(buffer[i+3]) +
(buffer[i+2] << 8) +
(buffer[i+1] << 16) +
(buffer[i] << 24);

vals[count] = *reinterpret_cast<float*>(&t);
}

发送数据包的 Python 服务器:

packer = struct.Struct('>%sf' % 8)
packed_data = packer.pack(*values)
sock.send(packed_data)

我觉得这可能是关于 int 和 float 之间转换的问题,但我似乎无法弄清楚。非常感谢任何帮助。

最佳答案

  1. buffer 正在使用 char,它可能已在您的系统上签名。

    如果 buffer[0]-1,则将其转换为 -1 作为 int (不再是 char)。这在将所有这些字节加在一起时会导致问题(因为 -1 作为 char 可能是 0xff,而作为 int 可能是 0xffffffff)。换句话说,如果缓冲区包含具有负值的字节,由于整数提升,这将搞砸字节的“合并”。

  2. 你在那里的 reinterpret cast 违反了严格的别名规则。这很可能适用于您可能使用的任何系统,但严格来说是未定义的行为。

您可以将其替换为将字节直接分配给 float 的代码,如下所示:

int size = 32;
char buffer[size];
float vals[8];
int count = 0;
int t;

// Receive a reply from the server
if (recv(sock, buffer, size, 0) < 0) {std::cout << "Receive failed..." << std::endl;}

for (int i = 0; count < 8; i += 4, count++) {
char* ptr = (char*)(vals + count);
// switch endianness as needed (though unlikely)
// (this is effectively equivalent to std::memcpy(vals, buffer, size))
ptr[0] = buffer[0];
ptr[1] = buffer[1];
ptr[2] = buffer[2];
ptr[3] = buffer[3];
}

更好的是(为了避免不必要的内存复制),如果你知道两台机器使用相同的浮点格式和大小,你可以用 recv 来完成这一切:

// read the bytes directly into the floats
recv(sock, vals, size, 0);

关于c++ - 从 tcp 读取 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31107211/

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