首页 > 解决方案 > C++(Arduino)中.NET的MemoryMarshal的等价物?

问题描述

我是来自 C# 的 Arduino 和 C++ 开发的新手,所以很可能缺少如此基本的理解。请相应地回答。

语境

我正在编写一个 Arduino 草图,借此我形成一个 Http GET 请求,以便从 Web API 接收数据。在收到响应时,我可以将流读入byte data[]using client.read(data,client.available())。在我的应用程序中,我知道每个都byte代表charASCII 编码。为了处理响应,我希望将其转换byte[]为 a char[],但这让我思考......

问题

在 C++ 中,如何在byte[]不复制内存的情况下将 a 一般转换为另一种已知类型?在 C# 中,我将使用MemoryMarshal. 有些东西告诉我我应该能够简单地从指针初始化一个对象?

非常感谢

标签: c++memory-managementcastingarduinomarshalling

解决方案


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);

推荐阅读