type
TH400 = record //описываем заголовок файла
b1,b2,b3:longint;
b4,b5,b6,b7,b8,b9,
b10,b11,b12,b13,b14,
b15,b16,b17,b18,b19,
b20,b21,b22,b23,b24,b25,b26,b27:word;
end;
THeadTras = record //описываем заголовок одной трассы
b1,b2,b3,b4,b5,b6,b7:longint;
b8,b9,b10,b11:word;
b12,b13,b14,b15,b16,b17,b18,b19:longint;
b20,b21:word;
b22,b23,b24,b25:longint;
b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37,
b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,
b50,b51,b52,b53,b54,b55,b56,b57,b58,b59,b60,b61,
b62,b63,b64,b65,b66,b67,b68,b69,b70,b71:word;
b72,b73,b74,b75,b76,b77,b78,b79:longint;
b80,b81,b82,b83,b84,b85,b86,b87,b88,b89,b90,b91,b92,b93:word;
end;
THTras = record //описываем трассу, что состоит из заголовка и массива данных
HeadTras:THeadTras;
Data: array[1..1000] of single;
end;
TFN = record // описываем ту часть файла, которая образует суть сейсмограммы и может повторятся несколько раз
Tras: array of THTras;
end;
TForm1 = class(TForm)
S1: TStringGrid;
S2: TStringGrid;
S3: TStringGrid;
Button1: TButton;
O1: TOpenDialog;
E1: TEdit;
E2: TEdit;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function SwapDWorD(X:DWord):dword;assembler; //функция для свопа 32х битного целого цисла
asm
bswap eax
end;
procedure TForm1.Button1Click(Sender: TObject);
var
F : TFILEStream; // переменная для связи с файлом
H400 : TH400; // переменная для заголовка файла
FN : TFN; // переменная для сбора всех трас сейсмограммы
//seg : array[1..2] of TFN;
i,j,k,index:integer; //счетчики
l:real; // для хранения кол-во FN
buf:single; // дальше для свопа чисел с плавающей точкой IEEE
dd:array [0..3] of byte absolute buf;
temp:byte;
begin
IF O1.Execute then
f:=TfileStream.Create(o1.FileName,fmOpenRead,fmShareDenyNone);
f.seek(3200,soFromcurrent);
f.Read(H400,sizeof(TH400)); //считываем заголовок файла
s1.Cells[1, 1]:=INTtostr(swapdword(H400.b1));
s1.Cells[1, 2]:=INTtostr(swapdword(H400.b2));
s1.Cells[1, 3]:=INTtostr(swapdword(H400.b3));
s1.Cells[1, 4]:=INTtostr(swap(H400.b4));
s1.Cells[1, 5]:=INTtostr(swap(H400.b5));
s1.Cells[1, 6]:=INTtostr(swap(H400.b6));
s1.Cells[1, 7]:=INTtostr(swap(H400.b7));
s1.Cells[1, 8]:=INTtostr(swap(H400.b8));
s1.Cells[1, 9]:=INTtostr(swap(H400.b9));
s1.Cells[1,10]:=INTtostr(swap(H400.b10));
s1.Cells[1,11]:=INTtostr(swap(H400.b11));
s1.Cells[1,12]:=INTtostr(swap(H400.b12));
s1.Cells[1,13]:=INTtostr(swap(H400.b13));
s1.Cells[1,14]:=INTtostr(swap(H400.b14));
s1.Cells[1,15]:=INTtostr(swap(H400.b15));
s1.Cells[1,16]:=INTtostr(swap(H400.b16));
s1.Cells[1,17]:=INTtostr(swap(H400.b17));
s1.Cells[1,18]:=INTtostr(swap(H400.b18));
s1.Cells[1,19]:=INTtostr(swap(H400.b19));
s1.Cells[1,20]:=INTtostr(swap(H400.b20));
s1.Cells[1,21]:=INTtostr(swap(H400.b21));
s1.Cells[1,22]:=INTtostr(swap(H400.b22));
s1.Cells[1,23]:=INTtostr(swap(H400.b23));
s1.Cells[1,24]:=INTtostr(swap(H400.b24));
s1.Cells[1,25]:=INTtostr(swap(H400.b25));
s1.Cells[1,26]:=INTtostr(swap(H400.b26));
s1.Cells[1,27]:=INTtostr(swap(H400.b27));
l:=(f.Size-3600)/(240*swap(H400.b4)+4*swap(H400.b8)*swap(H400.b4)); //узнаем кол-во сейсмограмм.
// для этого из всего //объема файла вычитаем его не повторяющиеся заголовки и делим на //повторяющуюся часть
e1.Text:=Floattostr(l);
s2.RowCount:=94; // для таблицы задаем ее свойства
s2.ColCount:=swap(H400.b4)+1; //кол-во трасс храниться в переменной Н400.b4
s3.RowCount:=swap(H400.b8)+1; // кол-во дискретов, воборки хранится в переменной H400.b4
s3.ColCount:=swap(H400.b4)+1;
f.Seek(340,soFromcurrent); //заголовок файла, который мы считываем //объемом 400 байт, а мы считали только 60, поэтому переводим курсор //на нужную позицию
// for index :=1 to 2 do begin
SETLength(fn.Tras,swap(H400.b4));
f.Read(fn,sizeof(fn)); //читаем в структуру FN переодическую часть
for k:=0 to swap(H400.b4)-1 do begin //запускаем счетчик, чтобы вывести данные заголовка трассы в соответствующие ячейки таблицы
s2.Cells[k, 1]:=INTtostr(swapdword(fn.tras[k].HeadTras.b1));
......................................................................................
s2.Cells[k, 7]:=INTtostr(swapdword(fn.tras[k].HeadTras.b7));
s2.Cells[k, 8]:=INTtostr(swap(fn.tras[k].HeadTras.b8));
........................................................................................
s2.Cells[k,11]:=INTtostr(swap(fn.tras[k].HeadTras.b11));
s2.Cells[k,12]:=INTtostr(swapdword(fn.tras[k].HeadTras.b12));
........................................................................................
s2.Cells[k,19]:=INTtostr(swapdword(fn.tras[k].HeadTras.b19));
s2.Cells[k,20]:=INTtostr(swap(fn.tras[k].HeadTras.b20));
s2.Cells[k,21]:=INTtostr(swap(fn.tras[k].HeadTras.b21));
s2.Cells[k,22]:=INTtostr(swapdword(fn.tras[k].HeadTras.b22));
........................................................................................
s2.Cells[k,25]:=INTtostr(swapdword(fn.tras[k].HeadTras.b25));
s2.Cells[k,26]:=INTtostr(swap(fn.tras[k].HeadTras.b26));
...............................................................................
s2.Cells[k,93]:=INTtostr(swap(fn.tras[k].HeadTras.b93));
for j:=1 to swap(H400.b8) do begin //свопируем данные выборки
buf:=fn.tras[k].data[j];
for i:=0 to 1 do begin
temp:=dd[i];
dd[i]:=dd[3-i];
dd[3-i]:=temp;
end;
s3.Cells[k,j]:=floattostr(buf); //каждой ячейке таблицы присваиваем соответсвующее значение выборки
fn.tras[k].Data[j]:=buf; // заменяем данные на свопированные
end;
end;
// seg[index]:=fn; //здесь хотелось бы прочитать второй fn, но что бы я для этого не делал результат - либо стек перегружен, либо аксес виолейшен:(
// end;
f.Free;
end;
end.