等同于 C++ (Arduino) 中的 .NET 的 MemoryMarshal?
Equivalent of .NET's MemoryMarshal in C++ (Arduino)?
我是 Arduino 和来自 C# 的 C++ 开发的新手,所以很可能缺少如此基本的理解。请相应回答。
上下文
我正在编写一个 Arduino 草图,由此我形成一个 Http GET 请求以便从 Web API 接收数据。在收到响应时,我能够使用 client.read(data,client.available())
将流读入 byte data[]
。在我的应用程序中,我知道每个 byte
代表 ASCII 编码的 char
。为了处理响应,我希望将此 byte[]
转换为 char[]
,但这让我开始思考...
问题
在 C++ 中,如何在不复制内存的情况下将 byte[]
一般转换为另一个已知类型?在 C# 中,我将使用 MemoryMarshal
实现此目的。有些东西告诉我我应该能够简单地从指针初始化一个对象?
非常感谢
byte 不是原生 C++ 类型,Arduino 环境使用 typedef 创建它,它实际上是 uint_8(无符号 8 位整数)类型。这也是 char 的基础类型,因此您实际上不必执行任何操作。字节数组和字符数组已经是相同的数据类型,只是标记不同而已。
您可以使用 (char)
类型转换来提高代码的清晰度,并且不会复制任何数据。
更新:
您可以在 C 或 C++ 中使用强制转换来告诉编译器将某些原始数据解释为不同的数据类型。在下面的示例中,包含 6 个浮点数的数组包含 XYXYXY 排列的二维向量,被转换为二维向量结构数组。这是在没有任何数据被复制的情况下完成的。然而,这种技术存在许多缺陷。您需要绝对确定编译器如何布置结构的底层存储。这不是由标准定义的,因此编译器之间可能会有所不同,许多编译器会为字对齐添加填充,这将根据所使用的体系结构而有所不同。所以请谨慎使用此方法。
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);
我是 Arduino 和来自 C# 的 C++ 开发的新手,所以很可能缺少如此基本的理解。请相应回答。
上下文
我正在编写一个 Arduino 草图,由此我形成一个 Http GET 请求以便从 Web API 接收数据。在收到响应时,我能够使用 client.read(data,client.available())
将流读入 byte data[]
。在我的应用程序中,我知道每个 byte
代表 ASCII 编码的 char
。为了处理响应,我希望将此 byte[]
转换为 char[]
,但这让我开始思考...
问题
在 C++ 中,如何在不复制内存的情况下将 byte[]
一般转换为另一个已知类型?在 C# 中,我将使用 MemoryMarshal
实现此目的。有些东西告诉我我应该能够简单地从指针初始化一个对象?
非常感谢
byte 不是原生 C++ 类型,Arduino 环境使用 typedef 创建它,它实际上是 uint_8(无符号 8 位整数)类型。这也是 char 的基础类型,因此您实际上不必执行任何操作。字节数组和字符数组已经是相同的数据类型,只是标记不同而已。
您可以使用 (char)
类型转换来提高代码的清晰度,并且不会复制任何数据。
更新:
您可以在 C 或 C++ 中使用强制转换来告诉编译器将某些原始数据解释为不同的数据类型。在下面的示例中,包含 6 个浮点数的数组包含 XYXYXY 排列的二维向量,被转换为二维向量结构数组。这是在没有任何数据被复制的情况下完成的。然而,这种技术存在许多缺陷。您需要绝对确定编译器如何布置结构的底层存储。这不是由标准定义的,因此编译器之间可能会有所不同,许多编译器会为字对齐添加填充,这将根据所使用的体系结构而有所不同。所以请谨慎使用此方法。
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);