如何通过 UDP + 无符号长运算符好奇发送 float[]
How to send float[] via UDP + Unsigned-Long-Operator-Curiosity
我正在编写一个C++应用程序,它从设备读取多个电压。我在float[]
中接收这些测量值,我想通过UDP将此数组发送到MATLAB脚本。
C++函数 sendto 需要获得一个char[]
缓冲区,我真的不知道如何将float[]
转换为char[]
缓冲区,以便我可以在 MATLAB 中轻松重组它。有什么想法吗?
我遇到的另一个问题是那条线
addr.sin_addr = inet_addr("127.0.0.1");
inet_addr返回一个无符号的长整型,但我的编译器告诉我 = 运算符在其右侧不接受无符号长整型数据类型。对此有什么想法吗?
您始终可以将任何对象变量视为字节序列。为此,明确允许(并且不违反别名或构成类型双关语)将任何对象指针重新解释为指向字节数组中第一个元素的指针(即任何char
类型)。
例:
T x;
char const * p = reinterpret_cast<char const *>(&x);
for (std::size_t i = 0; i != sizeof x; ++i) { /* p[i] is the ith byte in x */ }
对于您的情况:
float data[N];
char const * p = reinterpret_cast<char const *>(data);
write(fd, p, sizeof data);
要将 UDP 消息的格式设置为文本还是二进制。如果是文本,您可以使用 boost::lexical_cast 将浮点数转换为字符串。您可以根据需要以任何方式(逗号分隔的值、换行符分隔等)在 UDP 消息中构建字符串 valus,也可以使用已知格式,例如 JSON。
如果要传输二进制数据,请选择已知格式,例如 ONC RPC 使用的 XDR,并使用现有库工具创建二进制消息。
至于inet_addr错误,addr.sin_addr是一个结构in_addr。您需要将结果分配给sin_addr结构的s_addr成员,如下所示:
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
你的帖子中有两个问题。我相信这不是它应该的样子。
至于 float[]->byte[] conersion - 你应该检查 matlab 如何存储它的浮点变量。如果碰巧它使用与您的编译器相同的格式,仅用于您的计算机设置等,您可以简单地将它们作为字节数组发送[]。在任何其他情况下 - 不兼容的浮点字节格式,多台机器 - 您必须编写手动转换。首先每个浮点数到(例如)字符串,然后是许多浮点数。您的行可能如下所示:
1.41234;1.63756;456345.45634
至于addr.sin_addr——我认为你做错了。您应该访问
addr.sin_addr.s_addr = inet_addr("1.1.1.1");
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 没有从阵列<float>到阵列<int>的可行转换
- 数组下标的类型"float*[float]"无效
- 没有合适的构造函数可以从"float"转换为"_D3DCOLORVALUE"
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- 将 **float array 从 C++ Dll 传递给 python
- 错误:二进制'operator*' 'float'和'float[0]'类型的操作数无效
- float* 已在 Gameobject.obj 中定义
- 如何将 qml 的文本转换为 float 和 int
- 为什么将 1 添加到 numeric_limits<float>::min() 返回 1?
- 有没有比static_cast更优雅的从int到float的演员阵容<float>?
- 编译器给出错误:format 指定类型 'float *',但参数的类型'double' [-Wformat]
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 错误:无法将"float*"转换为"float"
- 好奇的混合与可变参数构造函数
- 如何在函数中将字符串和分数存储为(Int 或 float)
- 缩小从double到float的转换
- 着色器将uint8投射到float,并将其重新解释回uint
- 我一直收到错误"cannot convert 'float*' to 'float' in return"
- 如何通过 UDP + 无符号长运算符好奇发送 float[]