Форум: "Основная";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
ВнизНепонятки в типизированном файле Найти похожие ветки
← →
Darts (2002-09-09 14:47) [0]Есть типизированный файл, полученный из VB
Ниже структура файла для VB
Type TMetaData
BarCode As Double
IDCode As String*10
Name As String*60
End Type
Размер структуры составляет 78 байтов, причем тип Double занимает 8 байтов (на заметку).
Потребовалось мне считать этот файл из Delphi.
Объявил:
TRecord = record
BarCode: Double;
IDCode: String[10];
Name: String[60];
end;
var FRecord: TRecord;
И выяснилось, что размер записи TRecord (безразлично, упакована она или нет) SizeOf(FRecord) = 80 байтов.
Хотя Double (Delphi)занимает 8 байт.
Вопрос: почему такое расхождение в типах данных? И откуда взялось 2 байта?
← →
Виктор Щербаков (2002-09-09 14:50) [1]ИМХО, разница в размерах из-за выравнивания.
← →
Darts (2002-09-09 14:55) [2]Выравнивает струкутру кратной 16? (16 * 5 = 80)
Как все-таки прочитать такой файл? Открыть как двоичный?
← →
Старый Паскалист (2002-09-09 15:00) [3]>Вопрос: почему такое расхождение в типах данных? И откуда >взялось 2 байта?
BarCode: Double; // 8 байт
IDCode: String[10]; // размер - 11 байт без выравнивания
Name: String[60]; // размер - 61 байт без выравнивания
Сумма - 80
В старых паскалевских строках был доп. символ ([0]), в к-ром хранилась длина.
Кстати, как устроены строки в Васике, я не знаю. И не уверен, что они бинарно совпадают со старыми паскалевскими.
← →
Darts (2002-09-09 16:08) [4]Delphi выравнивает record по границам, кратным 4 байтам (выравнивание по двойным словам, т.е DWORD Aligment).
Но, господа, как мне обработать стркутуру, не кратную 4? Какие варианты? Неужто читать как бинарник?
← →
Старый Паскалист (2002-09-09 16:22) [5]2Darts
packed record
← →
Anatoly Podgoretsky (2002-09-09 16:32) [6]packed record позволяет обрабатывать структуры кратные 1
← →
Старый Паскалист (2002-09-09 17:17) [7]У меня есть предположение, что твою структуру
надо переводить на паскаль так:
(хотя гарантировать не буду)
TRecord = packed record
BarCode: Double;
IDCode: packed array [1..10] of Char;
Name: packed array [1..60] of Char;
end;
← →
Darts (2002-09-09 18:01) [8]Если использовать packed, картина та же (выравнивает строго ка 80 байт, см. первое сообщение.)
Но если воспользоваться предложением от Старый Паскалист (09.09.02 17:17), то все работает (можно опустить packed в массиве Char).
Благодарю за поддержку!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c