![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
есть задача прочитать файл формата SEG-D. файл состоит из заголовка и набора данных. есть ли какой-нить общий принцип, алгоритм, по которому работают с такими файлами-большая просьба рассказать о нем. еще одно: заголовок состоит из двоично-десятичных цифр. большая просьба рассказать про эти числа, как с ними работать итд.
|
|
#2
|
|||
|
|||
|
Описываешь струкруры блоков данных файла как записи. Потом открываешь файл через поток и начинаешь оттуда эти структуры читать.
Я не знаю формата этого файла, но как вообще будет выглядеть код (для некоторого виртуального файла) могу показать: Пусть у нас в файле сначала идет заголовок, содержащий сигнатуру файла, его мажорную и минорную версии и кол-во блоков данных. Каждый блок данных предваряется некоторым дескриптором, состоящим из типа блока и его размера. Далее идут данные блока и следующий блок с дескриптором. Код:
type
TFileHeader = packed record
Signature : DWORD;
VerMajor : BYTE;
VerMinor : BYTE;
BlocksCount : DWORD;
end;
TBlockDescription = packed record
BlockType : BYTE;
BlockSize : DWORD;
end;
TFullBlock = record
Descr : TBlockDescription;
Data : Pointer;
end;
procedure ReadFile(AFileName : String);
var
F : TFileStream;
H : TFileHeader;
B : Array Of TFullBlock;
I : Integer;
begin
F := TFileStream.Create(AFileName,fmOpenRead);
Try
F.ReadBuffer(H,SizeOf(TFileHeader));
SetLength(B,H.BlocksCount);
For I := 0 To H.BlocksCount-1 Do
Begin
F.ReadBuffer(B[i].Descr);
GetMem(B[i].Data,B[i].BlockSize);
F.ReadBuffer(B[i].Data^,B[i].BlockSize);
End;
Finally
F.Free;
End;
end; |
|
#3
|
|||
|
|||
|
спасибо за отклик. пример очень помог. но возникают еще сложности с числами.
например ситуация такая. данные организованы так, что в первых 4 байтах содержится число трасс, затем в следующих 2 номер пикета. переменная в которую копируются данные обозначено через byte. если зашифрованное число находится в пределах от 0 до 255 то оно выводится без проблем. если же число больше то оно разбивается на два байта или 2 переменные. например число 2000 будет выглядеть так - 1байт -7, 2 байт -208. если эти числа перевести в двоичное представление и склеить '111' '11010000' а потом перевести в десятичное представление - будет 2000. если переменную выразить через 2хбайтный тип данных, например word, то число 2000 будет выглядеть 53255 в переводе в двоичное представление - 1101000000000111, т.е '11010000' '00000' '111'. т.е перевернула двоичную последовательность и добавила между двумя уже знакомыми числами 5нулей. большая просьба научить читать числа правильно. |
|
#4
|
||||
|
||||
|
Трудновато что-то понять не имея перед собой этих данных, но возможно вам поможет такая информация:
В файл большие числа записываются наоборот т.е. если имеется двухбайтовое число $01$20, то запишется в файл $20$01 при чтении данных из файла это надо иметь ввиду. Очень может помочь в такого рода декодировании файла хорошая программа 010 Editor которая живет тут http://www.sweetscape.com/010editor/ |
|
#5
|
|||
|
|||
|
спасибо за наводку. раз большие числа записываются наоборот,то хотелось бы узнать, как их читать. программу скачаю, поюзаю, но мне надо самому научится считывать большие числа из файлов
|
|
#6
|
||||
|
||||
|
для 32 бит
Код:
function SwapDWORD(X: DWORD): DWORD; assembler;
asm
bswap eax
end;![]() Последний раз редактировалось dr. F.I.N., 18.05.2010 в 19:15. |
|
#7
|
|||
|
|||
|
спасибо за код. но мне не понятно. может есть учебник, где все подробно разжевано?
|