访问对象的字节

时间:2012-10-12 22:08:01

标签: c++ .net c++-cli

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

2 个答案:

答案 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 ++类,所以它就像地狱一样!!