如何解决相当于 C++ (Arduino) 中的 .NET MemoryMarshal?
我是来自 C# 的 Arduino 和 C++ 开发的新手,所以可能缺少如此基本的理解。请相应回答。
上下文
我正在编写一个 Arduino 草图,借此我形成了一个 Http GET 请求,以便从 Web API 接收数据。在接收响应时,我可以使用 byte data[]
将流读入 client.read(data,client.available())
。在我的应用程序中,我知道每个 byte
代表一个 ASCII 编码的 char
。为了处理响应,我希望将此 byte[]
转换为 char[]
,但这让我想到...
问题
在 C++ 中,如何在不复制内存的情况下将 byte[]
转换为另一种已知类型?在 C# 中,我会使用 MemoryMarshal
来实现这一点。有人告诉我,我应该能够简单地从指针初始化一个对象?
非常感谢
解决方法
byte 不是本机 C++ 类型,Arduino 环境使用 typedef 创建它,它实际上是 uint_8(无符号 8 位整数)类型。这也是 char 的基础类型,因此您实际上无需执行任何操作。字节数组和字符数组已经是相同的数据类型,只是标记不同。
您可以使用 (char)
强制转换来提高代码的清晰度,而这不会复制任何数据。
更新:
您可以在 C 或 C++ 中使用强制转换来告诉编译器将某些原始数据解释为不同的数据类型。在下面的示例中,包含 XYXYXY 排列的二维向量的 6 个浮点数组被转换为二维向量结构数组。这是在没有任何数据被复制的情况下完成的。然而,这种技术存在许多缺陷。您需要绝对确定编译器如何布置结构的底层存储。这不是由标准定义的,因此可能因编译器而异,许多会添加用于字对齐的填充,这将根据所使用的体系结构而有所不同。所以请谨慎使用此方法。
struct My2DVector {
float x,y;
}
float flatVectorData[] = { 0.0,1.0,2.0,2.5,-5.0,3.0};
// Cast the pointer to float to a pointer to My2DVector
My2DVector* structVectorData = (My2DVector*)flatVectorData;
printf("Vector 2 (%f %f)\n",structVectorData[1].x,structVectorData[1].y);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。