Доступ к байту объекта

У меня есть объект, который не содержит общедоступных переменных, но все, что он делает, это хранит данные (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

Решение

Я думаю, что лучший подход — это использовать собственный код C ++ внутри проекта .NET и использовать прекрасный memcpy или даже приведение типа (что еще быстрее), например

int n1 = * (unsigned char*) (DataRecord + LowestBytes);
int n2 = * (int16_t*) (DataRecord + LowestBytes);
int n4 = * (int32_t*) (DataRecord + LowestBytes);

Так как в .NET вы должны использовать Marshal и так как ваш класс является родным классом C ++, это что-то вроде ада !!

0

Другие решения

Если предоставляемые объекты являются объектами CLI, то, как правило, прямой доступ к байтам нецелесообразен. Я считаю, что это возможно с помощью Marshalling, однако было бы проще просто использовать отражение для доступа к закрытым / защищенным членам. Например:

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;
}
0