|
|
Регистрация | << Правила форума >> | 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]. Разобрался, файл прочитал Всем спасибо. |