У меня есть объект, который не содержит общедоступных переменных, но все, что он делает, это хранит данные (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 байтов.
Я думаю, что лучший подход — это использовать собственный код C ++ внутри проекта .NET и использовать прекрасный memcpy
или даже приведение типа (что еще быстрее), например
int n1 = * (unsigned char*) (DataRecord + LowestBytes);
int n2 = * (int16_t*) (DataRecord + LowestBytes);
int n4 = * (int32_t*) (DataRecord + LowestBytes);
Так как в .NET вы должны использовать Marshal
и так как ваш класс является родным классом C ++, это что-то вроде ада !!
Если предоставляемые объекты являются объектами 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;
}