我有一个CameraSpacePoint数组,我用C#编程语言将其转换为字节。 CameraSpacePoint
定义如下:
namespace Microsoft.Kinect
{
public struct CameraSpacePoint
{
public float X;
public float Y;
public float Z;
}
}
要将CameraSpacePoint
数组转换为字节,我在C#中使用了以下方法:
public static byte[] ObjectToByteArray(Object obj)
{
BinaryFormatter bf = new BinaryFormatter();
using (var ms = new MemoryStream())
{
bf.Serialize(ms, obj);
return ms.ToArray();
}
}
然后使用TCP传输字节数组。我试图以下列方式在另一台机器上接收这个字节数组:
#include <ros/ros.h>
#include <boost/asio.hpp>
constexpr size_t data_size = 512 * 424;
unsigned char data_buffer[data_size];
boost::asio::read(socket, boost::asio::buffer(data_buffer, data_size));
我在C ++中声明了一个类似的类:
class CameraSpacePoint
{
public:
float X;
float Y;
float Z;
};
我想知道如何将字节数组转换为我定义的CameraSpacePoint
数组对象?
答案 0 :(得分:2)
C#编程语言中的对象的内存布局和序列化与C / C ++中的类似概念无关。拥有不同的编译器/操作系统,即使在C ++到C ++场景中,您也可以为相同的结构或类获得不同的内存布局(根据内存布局等)。
您真正需要的是两种语言的通用协议,用于序列化和反序列化类似对象。有一些序列化库支持这两种语言:
Google's Protocol Buffers支持C#和C ++,它是平台中立的。 (例如,您可以使用它在big-endian ARM和little-endian x86_64之间进行序列化/反序列化)
Microsoft Bond支持C#和C ++