Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2011, 11:53   #1
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию Конвертер бинарных данных

Есть бинарный файл, я написал программку, которая считывает ее. А также есть описание структуры файла, не могу понять как использовать ее, в смысле как написать эту структуру программно. Я так понял описание структуры файла используется чтобы мы правильно прочитали этот файл. Вот вложил описание этого файла.
Вложения
Тип файла: zip A4.zip (38.9 Кб, 12 просмотров)
royun вне форума Ответить с цитированием
Старый 22.08.2011, 12:40   #2
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Видимо кто-то, вместо использования БД, решил создать свою структуру файла данных, при этом очень нагруженную. Ну что сказать, разбирайтесь и пишите, все возможно, только придется приложить немного мозгов и время.
Конечно было бы здорово сразу считывать целую структуру данных, так и нужно, но "вгонять" её в память надо поэлементно (по полям записи). Весь код надо разбить на логические блоки:
1. Считывает следующий блок
2. Обрабатывает и добавляет стуктуру (запись) в массив
и тд.
Вначале надо разобраться (если не ясно), любую сложную задачу можно решить разбив её на мелкие, легкие "куски".
Скажите спасибо создателям структуры этого файла, хотя бы за то, что есть документация
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 30.08.2011, 07:45   #3
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

И так вот что у меня получилось.

Код:
type
  AMA = packed record
  RecId : Byte;  //Идентификатор записи
  LenRec : Word; //Длина записи
  Flags : array[1..3] of Byte; //Флажки
  SeqAndStat : Byte; //Посл-сть записи Статус оплаты
  LenLacAndOwnId : Byte; //Длина LAC и ID владельца
  {DnA : TStream; - Проблема в том что не умею работать с потоками: как использовать поток затем вывести данные}
  DnA : array[1..5] of Byte; //Переменная часть - Номер абонента А -    
                             //значение массива просто подобрал исп. hexviewer
                             //Если просто пишу DnA : array of Byte; то выходит 
                             //ошибка, где говорится о том что требуется 
                             //финализация переменной  f: file of AMA;
                             //Значение переменного массива рассчитывается как 
                             //DnA : array[1..i] of Byte где i = div [(LenLacAndOwnId+1)/2]
  //Описание Пакета № 100
  Np100 : Byte; //Номер пакета
  Date : array[1..3] of Byte; //Дата
  Time : array[1..3] of Byte; //Время
  Flags100 : Byte; //Флажки Пакета № 100
  Prod : array[1..3] of byte;//Прод-сть
  //Описание Пакета № 101
  Np101 : Byte; //Номер пакета
  LenDnB : Byte; //Длина номера абонента Б
  {DnB : TStream; - Проблема в том что не умею работать с потоками: как использовать поток затем вывести данные}
  DnB : array[1..1] of Byte;  //Переменная часть - Номер абонента Б - 
                              //значение массива просто подобрал исп. hexviewer
                              //Если просто пишу DnA : array of Byte; то выходит  
                              //ошибка, где говорится о том что требуется 
                              //финализация переменной  f: file of AMA;
                             //Значение переменного массива рассчитывается как 
                             //DnB : array[1..j] of Byte где j = div [(LenDnB+1)/2]
  //Описание Пакета № 130
  Np130 : Byte; //Номер пакета
  LenP : Byte; //Длина пакета
  Zp : Word; //Значение причины
  RezAndOpr : byte; //Резерв и определение
  //Описание Пакета № 103
  Np103 : Byte; //Номер пакета
  TeTv : array[1..3] of byte; // Тарифные единицы для тарификации вызова
 
  end;
    TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    OpenDialog: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  f: file of AMA;
  open : Topendialog;
  Rec : AMA;
  Buffer : array [0..8191] of byte;
  NumRecsRead,t : integer;
begin
  memo1.Clear;
  open := TOpenDialog.Create(self);
  open.InitialDir := 'C:\000';
  open.Options := [ofFileMustExist];
  open.Filter :=  'ama files|*.*';
  open.Execute;
  AssignFile(f,open.FileName);
  {$I-}
  Reset(f);
  {$I+}
  seek(f,0);
  {while not eof(f) do
  begin}
  Read(f,Rec);
  memo1.Lines.Add(inttostr(Rec.RecId) + ' - ИДЕНТИФИКАТОР ЗАПИСИ');
  memo1.Lines.Add(inttostr(Rec.LenRec) + ' - ДЛИНА ЗАПИСИ');
  memo1.Lines.Add(inttostr(Rec.Flags[1]) + ' - Флажок F12');
  memo1.Lines.Add(inttostr(Rec.Flags[2]) + ' - Флажок F12');
  memo1.Lines.Add(inttostr(Rec.Flags[3]) + ' - Флажок F12');
  memo1.Lines.Add(inttostr(Rec.SeqAndStat) + ' - Посл-сть записи и статус оплаты');
  memo1.Lines.Add(inttostr(Rec.LenLacAndOwnId) + ' - Длина LAC и ID владельца');
  memo1.Lines.Add(inttohex(Rec.DnA[1],1) + inttohex(Rec.DnA[2],1) + inttohex(Rec.DnA[3],1) + inttohex(Rec.DnA[4],1) + inttohex(Rec.DnA[5],1) + ' - Номер абонента А');
  //Выводим пакет № 100
  memo1.Lines.Add(inttostr(Rec.Np100) + ' - Номер пакета');
  memo1.Lines.Add(inttohex(Rec.Date[3],1) +'.'+ inttohex(Rec.Date[2],1) +'.'+ inttohex(Rec.Date[1],1) + ' - Дата');
  memo1.Lines.Add(inttostr(Rec.Time[1]) +':'+ inttostr(Rec.Time[2]) +':'+ inttostr(Rec.Time[3]) + ' - Время');
  memo1.Lines.Add(inttohex(Rec.Prod[3],1) +':'+ inttohex(Rec.Prod[2],1) +':'+ inttohex(Rec.Prod[1],1) + ' - Продолжительность');
  //Выводим пакет № 101
  memo1.Lines.Add(inttostr(Rec.Np101) + ' - Номер пакета');
  memo1.Lines.Add(inttostr(Rec.LenDnB) + ' - Длина номера абонента Б');
  memo1.Lines.Add(inttostr(Rec.DnB[1]) + ' - Номера абонента Б');
  //Выводим пакет № 130
  memo1.Lines.Add(inttostr(Rec.Np130) + ' - Номер пакета');
  memo1.Lines.Add(inttostr(Rec.LenP) + ' - Длина пакета');
  memo1.Lines.Add(inttostr(Rec.Zp) + ' - Причина');
  memo1.Lines.Add(inttostr(Rec.RezAndOpr) + ' - Резерв и определение');  
 
  {end;}
  CloseFile(f);
  end;]
Как обойти ошибку которая требует финализации переменной f: file of AMA или дайте ссылочку где можно почитать про работу с потоками.

Последний раз редактировалось royun; 30.08.2011 в 09:05.
royun вне форума Ответить с цитированием
Старый 30.08.2011, 09:34   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Непонятно как связана эта самая финализация с потоками..
mss вне форума Ответить с цитированием
Старый 30.08.2011, 10:22   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Как обойти ошибку которая требует финализации переменной f: file of AMA
дело в том, что использовать типизированные файлы ( : file of ВашТип ) можно только в том случае, когда файл представляет собой набор структур СТРОГО ЗАДАННОГО РАЗМЕРА
Боюсь, что в Вашем случае это не так...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.08.2011, 11:50   #6
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

не факт, что использовались типизированные файлы Delphi, а глядя на документацию это точно. Для простоты использования юзайте файловые потоки. А в остальном помочь не могу, потому что у каждого своя работа, а писать за кого-то код конечно можно, но за $
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обход бинарных деревьев noskovgleb C++ Builder 1 28.05.2011 20:03
Конвертер базы данных Двоешник Помощь студентам 3 24.02.2011 08:34
Перегрузка бинарных операторов. Namolem Помощь студентам 1 15.09.2010 21:44
МАТРИЦА БИНАРНЫХ ОТНОШЕНИЙ ai\ekcah^p Помощь студентам 1 12.07.2009 13:10
Обработка бинарных файлов (Си) Сэм Помощь студентам 35 01.05.2009 21:18