![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
здравствуйте, Возникла проблемма в дельфи при чтении бинарного файла.
Что за глюк? немогу прочитать правильно бинарник - с другими никогда проблемм не возникало. Бинарник структкрированый, но не хочет читаться правильно. Файл формата 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;читать побитно не выход, помогите прочитать этот файл. Хотя бы заголовки. |
|
#2
|
|||
|
|||
|
Попробуй указать у рекордов, что они packed.
|
|
#3
|
||||
|
||||
|
Предположу, что все дело в типе String в структуре. Попробуйте так:
Код:
type Tzagolovok = record ILDA_ident : Array[1..4] of char; FormatCode : Array[1..4] of char; |
|
#4
|
|||
|
|||
|
Спасибо.
дело не в packed а в том что string хватало другое количество байт. помогло ILDA_ident : Array[1..4] of char; Хотя никогда с другими бинарниками проблемм небыло, да и все примеры что нашел в интернете использовали именно String[x]. Разобрался, файл прочитал Всем спасибо. |