【发布时间】:2019-12-07 09:46:06
【问题描述】:
我正在微控制器和计算机之间进行 UDP 连接。 我使用的框架是基于 c++ 的,并且具有发送具有以下原型的 UDP 数据包的功能:
bool UdpConnection::send(const char *data, int length)
int length 是指针包含的字节数。
但我正在使用返回 uint16_t 类型的函数进行一些输入读取。
我无法直接在这两个函数中更改任何内容。
然后我做了以下事情:
UdpConnection udp;
uint16_t dummy = 256;
udp.send(reinterpret_cast<char*>(dummy),2);
但我是个好奇的人,所以我尝试了以下方法:
UdpConnection udp;
uint16_t dummy = 256;
udp.send((char*)dummy,2);
当我编译最后一段代码时,我得到:
error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
在我的分析中,两个 sn-ps 都做同样的事情,为什么我在最后一个中得到错误而在第一个中没有?
编辑:
代码的第一个 sn-p 编译但在代码运行时出现分段错误。所以这两个代码都不起作用。
编辑 2:
该问题的有效且经过测试的解决方案,但不是原始问题的答案,是这样的:
union Shifter {
uint16_t b16;
char b8[2];
} static shifter;
shifter.b16 = 256;
udp.send(shifter.b8,2);
此解决方案被广泛使用,但由于它依赖于 CPU 字节顺序,因此不可移植,因此请先在您的应用程序中进行测试以确定。
【问题讨论】:
-
作为
data参数,实际创建一个char*字符串消息并将其传入不是很明智吗?您还可以根据该字符串计算length的值。 -
是的没有意义,看我的编辑。
-
有人能解释一下为什么这个问题被否决了吗?
-
@ifconfig 我正在努力提高效率。但你是对的!
-
"everything works" 你发东西,对方收到什么?
标签: c++ pointers casting int reinterpret-cast