здравствуйте, Возникла проблемма в дельфи при чтении бинарного файла.
Что за глюк? немогу прочитать правильно бинарник - с другими никогда проблемм не возникало.
Бинарник структкрированый, но не хочет читаться правильно.
Файл формата ILDA (пдф ку с описанием прилагаю).
Файл состоит из блока заголовков и блока данных, данные читаются хорошо, а вот заголовки всё время неправильно,
пробовал несколькими способами результат один.
из этого файла мне нужно прочитать к примеру 3D координаты - (формат код 0,0,0,0 по описанию)
я создаю новый тип
Код:
type Tzagolovok = record
ILDA_ident : String[4];
FormatCode : string[4] ;
{тут может быть и
FormatCodea : byte ;
FormatCodeb : byte ;
FormatCodec : byte ;
FormatCode : byte ;
и другие комбинации результат один - неверно проочитанный заголовок}
FrameName : String[8];
CompanyName : String[8];
PointsNumber : Word ;
FrameNumber : Word ;
TotalFrames : Word ;
ScannerHead : Byte;
Future : Byte;
а дальше читаю или так:
Код:
Stream := TFileStream.Create(open.FileName, fmOpenRead);
Stream.ReadBuffer(zag, SizeOf(Tzagolovok));
или так
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
f: file of Tzagolovok ;
open : Topendialog;
pec : Tzagolovok;
begin
memo1.Clear;
open := TOpenDialog.Create(self);
open.InitialDir := 'C:\000';
open.Options := [ofFileMustExist];
open.Filter := 'Ilda files|*.ild';
open.Execute;
AssignFile(f,open.FileName);
{$I-}
Reset(f);
{$I+}
seek(f,0);
Read(f,pec);
memo1.Lines.Add(pec.ILDA_ident);
memo1.Lines.Add(inttostr(pec.FormatCodea)+' формат код');
memo1.Lines.Add(inttostr(pec.FormatCodeb)+' формат код');
memo1.Lines.Add(inttostr(pec.FormatCodec)+' формат код');
memo1.Lines.Add(inttostr(pec.FormatCode)+' формат код');
memo1.Lines.Add(pec.FrameName+' имя фрейма');
memo1.Lines.Add(pec.CompanyName+' Название компании');
memo1.Lines.Add(inttostr(pec.PointsNumber)+' номер точки');
memo1.Lines.Add(inttostr(pec.FrameNumber)+' номер фрейма');
memo1.Lines.Add(inttostr(pec.TotalFrames)+' всего фреймов');
memo1.Lines.Add(inttostr(pec.ScannerHead)+' Сканирующая голова');
memo1.Lines.Add(inttostr(pec.Future)+' футура');
CloseFile(f);
end;
результат такой:
LDA
0
256
0
56473
1
244
А должен быть (смотрел в hex редакторе) (прилагаю тестовый файл).
ILDA
0 формат код
0 формат код
0 формат код
0 формат код
Fr00000 имя фрейма
Название компании
548-Количество точек
1-номер кадра
1- количество кадров
0- Сканирующая голова
0-футура
тоесть дельфи отказывается читать этот файл как структурированый.
Приходится читать по 1 байту за раз анализировать и так делее в итоге код типа (сильно не смеяться я с этой
проблеммой неделю вожусь уже)
Код:
while not Eof(f) do
begin
Inc(i);
BlockRead(f,c,1);
// ищем заголовок
if Chr(c)='I' then s:=chr(c);
if Chr(c)='L' then s:=s+chr(c);
if Chr(c)='D' then s:=s+chr(c);
if Chr(c)='A' then s:=s+chr(c);
if s='ILDA' then
begin
j:=4;
form1.memo1.Lines.Add(s);
s:='';
// n:=i-4;
Continue;
end;
inc(j);
///// Чтоение формат кода
if (j> 4) and (j<= 8) then
begin
form1.memo1.Lines.Add(inttostr(c));
if (j=8)and(c=0)and(n=0) then
begin
n:=i-7;
form1.memo1.Lines.Add(inttostr(n)+' - номер начала')
end;
end;
// Чтение имени фрейма
if (j>8) and (j<= 16) then
begin
s := s+chr(c);
if j = 16 then begin
form1.memo1.Lines.Add(s+'-имя фрейма');
S:='';
end;
end;
//////////// и так далее
но что бы прочитать файл 1-2 мегобайта размером нужно ждать... кажется что программа зависла.
зато координаты читаются отлично.
вот пример:
Код:
Type
TCOORDINATE = record
X : Smallint;
Y : Smallint;
Z : Smallint;
Blanking : Byte ;
Color : Byte;
End;
Coordinat = file of TCOORDINATE;
for I := 0 to kol do
begin
Read(fil,pec);
{расбираю координаты }
end;
читать побитно не выход, помогите прочитать этот файл.
Хотя бы заголовки.