我有一个不包含公共变量的对象,但它只是保存数据(另一个公司API,而不是我可以改变的东西)。他们确实为我提供了字节映射,告诉我哪些值是多长,以及它们的位置。
我不知道如何访问这些字段。在大学里我们用memcpy做了很多,但在CLI中我怀疑这是正确的方法......
从这个对象中提取信息字节的最佳方法是什么?
下面是我想要完成的一个简单的伪代码,我只是不确定在语法上做这个的最佳方法。我对CLI和.Net不是很熟悉,并认为必须有一个很好的方法来解决这个问题......
int GetSingleDataPoint(int LowestByte,int NumOfBytes, Object^ DataRecord)
Copy the NumOfBytes starting at DataRecord[LowestBytes] to a temporary integer
return temporary integer
如果在本次讨论中一点都重要,那么数据就是小端包装,并且包含1-4个字节长的有符号和无符号变量。
答案 0 :(得分:0)
如果提供的对象是CLI对象,则通常不适合直接访问字节。我相信可以使用编组,但是使用反射访问私有/受保护成员会更容易。例如:
Object^ getFieldByName(Object^ obj, String^ name, Type^ t)
{
return t->GetField(name, BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance)->GetValue(obj);
}
如果它是原生对象,请执行以下操作(基本上您在问题中建议的内容):
int GetSingleDataPoint(int LowestByte,int NumOfBytes, void* object)
{
int result;
size_t numBytes;
numBytes = NumOfBytes;
if(numBytes > sizeof(int))
numBytes = sizeof(int);
memcpy(&result, object+LowestByte, numBytes);
return result;
}
答案 1 :(得分:0)
我认为最好的方法是在.NET项目中使用C ++本机代码并使用可爱的memcpy
甚至是类型转换(更快),例如
int n1 = * (unsigned char*) (DataRecord + LowestBytes);
int n2 = * (int16_t*) (DataRecord + LowestBytes);
int n4 = * (int32_t*) (DataRecord + LowestBytes);
因为在.NET中你必须使用Marshal
,因为你的类是本地C ++类,所以它就像地狱一样!!