2016-03-15 4 views
1

Я хочу, чтобы перейти старые файлы первые в читаемый тип человека, поэтому в Delphi коде следующим образом:Чтение бинарный файл из Дельф

OpenFileWriteRA(MyF, dd+'invoice.mfs', SizeOf(TFSerialDocEx)) then 

и затем вызвать

ReadFile(MyF, vSS1, SizeOf(TFSerialDocEx), nr1, nil); 

Так я ищу способ конвертировать эти файлы, используя небольшую программу, я хочу сделать это с C#, так как я более знаком с C#, чем с Delphi. .MFS-файл написан в двоичном формате, поэтому мне нужно было бы преобразовать это в текст/строку, я попробовал с помощью простого двоичного конвертирования, но это было не нормально, так как кажется, что объект SizeOf у параметров является большой вещью здесь или?

+0

Точно так же, как и с C#, чтобы быть честным - прочитайте структуры в, напишите их в удобном для человека способом – BugFinder

+0

Итак, я должен сначала перенести объект (или структуру?) На C#? А потом попробуйте их прочитать? – HyperX

+0

Нет, Id stick с delphi, читая их. – BugFinder

ответ

4

Там в широком смысле есть три подхода, которые я хотел бы рассмотреть:

1. Преобразование данных с Delphi кодом

Поскольку у вас уже есть Delphi код для чтения данных, и определены структуры, это будет проще и быстрее преобразовывать данные с помощью кода Delphi. Просто прочитайте его, используя свой существующий код, а затем выведите его в удобочитаемой форме. Например, используя встроенные библиотеки JSON.

2. Определить эквивалентную отформатирована структуру C# и блитирование двоичных данных на эту структуру

Определить отформатированную структуру в C#, который имеет одинаковое бинарное расположение к структуре, поставленной на диск. Это будет использовать LayoutKind.Sequential и, возможно, указать Pack = 1, если структура Delphi будет упакована. Для достижения бинарной эквивалентности вам может понадобиться использовать атрибут MarshalAs для некоторых членов. Затем прочитайте структуру с диска в массив байтов. Выделите этот массив и используйте дескриптор Marshal.PtrToStructure на прикрепленном объекте. Теперь у вас есть данные, вы можете написать это, как вам угодно.

Примера можно найти здесь: Proper struct layout from delphi packed record

3. Прочитайте поле структуры на поле с двоичным читателем

Вместо того, чтобы объявить бинарную совместимую структуру, которую вы можете использовать BinaryReader для чтения из поток по одному полю за раз. Способы вызова, такие как Read, ReadInt32, ReadDouble и т. Д. Позволяют вам прокладывать себе путь через запись. Помните, что поля будут записаны в том порядке, в котором была объявлена ​​запись Delphi. Если исходная запись выровнена, а не упакована, вам нужно будет перешагнуть через любое дополнение. Опять же, как только у вас есть данные, доступные для вашего кода на C#, вы можете написать его, как вам будет угодно.

+0

Если бы я был незнаком с Delphi, я бы предпочел решение 3. Вероятно, немного медленнее, но для одноразового события это не имело бы большого значения. Но даже тогда я бы посмотрел на свои данные с помощью шестнадцатеричного редактора, чтобы проверить, нет ли пропущенных байтов наполнителя. –

Смежные вопросы