0

我有一个不包含公共变量的对象,但它所做的只是保存数据(另一个公司的 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 字节长的有符号和无符号变量。

4

2 回答 2

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;
}
于 2012-10-12T22:11:34.760 回答
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++ 类,所以它就像地狱一样!!

于 2012-10-12T22:14:17.937 回答