Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.19;
Скачать: CL | DM;

Вниз

Непонятки в типизированном файле   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
1-61201
Hagis
2002-09-08 14:00
2002.09.19
Как в переменную типа String загнать 3 строку из текстового файла


4-61372
baataar
2002-07-29 19:38
2002.09.19
Выбор директории


4-61356
ACR
2002-07-29 14:27
2002.09.19
синхронизироваться с горизонтальной разверткой ?


14-61265
asafr
2002-08-23 11:59
2002.09.19
Новые правила дорожного движения ГИБДД.


1-61048
WFox
2002-09-09 10:55
2002.09.19
ComboBox и формат страницы