Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.10.2010, 19:41
ryazanec ryazanec вне форума
Прохожий
 
Регистрация: 24.10.2010
Сообщения: 2
Репутация: 10
По умолчанию Чтение бинарного файла

здравствуйте, Возникла проблемма в дельфи при чтении бинарного файла.
Что за глюк? немогу прочитать правильно бинарник - с другими никогда проблемм не возникало.


Бинарник структкрированый, но не хочет читаться правильно.

Файл формата 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;



читать побитно не выход, помогите прочитать этот файл.
Хотя бы заголовки.
Вложения
Тип файла: rar IDTF05-finaldraft.rar (54.1 Кбайт, 12 просмотров)
Тип файла: rar test.rar (1.2 Кбайт, 15 просмотров)
Ответить с цитированием
  #2  
Старый 24.10.2010, 19:56
lmikle lmikle сейчас на форуме
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Попробуй указать у рекордов, что они packed.
Ответить с цитированием
  #3  
Старый 24.10.2010, 22:48
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Предположу, что все дело в типе String в структуре. Попробуйте так:
Код:
type Tzagolovok = record
  ILDA_ident : Array[1..4] of char;
  FormatCode  : Array[1..4] of char;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 25.10.2010, 21:02
ryazanec ryazanec вне форума
Прохожий
 
Регистрация: 24.10.2010
Сообщения: 2
Репутация: 10
По умолчанию

Спасибо.
дело не в packed а в том что string хватало другое количество байт.
помогло ILDA_ident : Array[1..4] of char;
Хотя никогда с другими бинарниками проблемм небыло, да и все примеры что нашел в интернете использовали именно String[x].
Разобрался, файл прочитал Всем спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter