Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.043 c
6-61232
alexru
2002-07-16 15:02
2002.09.19
Помогите сделать продвинутый Веб броузер !


1-61163
Poirot
2002-09-07 11:56
2002.09.19
Как вшивают любой файл в BMP например!!!


14-61287
delphiguru
2002-08-23 19:32
2002.09.19
ShellExecute и WinExec


1-61098
ga3
2002-09-09 04:06
2002.09.19
proxy: dead or alive?


4-61365
Kasalex
2002-07-29 11:20
2002.09.19
Эмуляция нажатия клавиш в DOS-приложениях





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский