|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
помогите побороть файл SEG-D
есть задача прочитать файл формата 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
|
|||
|
|||
спасибо за код. но мне не понятно. может есть учебник, где все подробно разжевано?
|
#8
|
|||
|
|||
огромное спасибо доктор фин. твоя функция работает!!!
хотелось бы еще все таки ознакомится со специальной литературой на эту тему. |
#9
|
|||
|
|||
возникает новая проблема.
далее мне надо прочитать выборку данных. 32х битных формат с плавающей запятой стандарта IEEE. число выборки - 1000 я описываю переменную через массив [1..1000] типа single. считываю в переменную 4000 байт. значение каждой выборки присваиваю отдельной ячейки в таблице StringGrid, приводя тип из вещественного в строковый. выполнение прерывается ошибкой. не правильная операция с вещественным числом. в таблице оказываются данные до 800 с хвостиком выборки. также в таблице встречается слово NAN. помогите распознать ошибку. что такое NAN , надо ли переворачивать биты у вещественных чисел? (я попробовал, но компилятор заругался) |
#10
|
|||
|
|||
помогите, пожалуйста
|
#11
|
||||
|
||||
Вот почитайте такую статейку:
http://abc.vvsu.ru/Books/ebooks_iskt...B%F5/prt02.htm Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#12
|
|||
|
|||
оказывается надо биты и у вещественных чисел переворачивать. тогда никаких ошибок. всем спасибо
|