Я пытаюсь реконструировать кучу устаревших двоичных данных в моей компании, чтобы я мог перевести их в более надежный формат. Приложение, которое мы использовали для создания этих данных, больше не поддерживается.
Я выяснил, что я могу описать данные в серии структур, и я смог их перенести в управляемую среду с помощью Marshal.PtrToStructure, за исключением одного файла.
Ниже я привел образец структуры, которую я пытаюсь проанализировать. Все необработанные данные являются последовательными, и я пытаюсь десериализовать за один шаг.
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct DrillTPD
{
public short Header;
public short Header2;
public short Header3;
public short RecordCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 999)]
public TPDHeader[] Templates;
}
[StructLayout(LayoutKind.Sequential, Pack = 1, Size=18)]
struct TPDHeader
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string TemplateName;
public int TPDIndex;
}
TPDIndex - это смещение в байтах от начала файла. Как я могу добавить свойство для правильной десериализации этих данных?
[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 76)]
struct TPDParent
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]
public string TemplateName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 25)]
public string Description;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string Field;
public double Width;
public double Length;
public double Thickness;
public short WL;
public short XY;
public short Origin;
public short Features;
[MarshalAs(UnmanagedType.ByValArray)]
public TPDDetail[] Details;
}
[StructLayout(LayoutKind.Sequential, Pack=1, Size=350)]
struct TPDDetail
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 350)]
public string Text;
}
Массив TPDDetail в TPDParent определяется компонентами в структуре. Если функции отсутствуют, данные TPDDetail отсутствуют после TPDParent.
Как динамически сообщить десериализатору размер массива TPDDetail?
Псевдо XML Структура этих данных в идеале будет выглядеть так:
<DrillTPD>
<TPDHeader>
<TPDParent>
<TPDDetail/>
<TPDDetail/>
<TPDDetail/>
</TPDParent>
</TPDHeader>
<TPDHeader>
.....
</TPDHeader>
</DrillTPD>
Последний комментарий: я когда-либо работал только на языках .NET, но я пытаюсь понять неуправляемую сторону вещей. Спасибо, что нашли ответы на свои вопросы. :)