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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2012, 14:17   #11
Brutalus
Пользователь
 
Регистрация: 07.06.2012
Сообщений: 10
По умолчанию

В таком случае в переменной BigInd будет лежать весь тот файл в HEX'e и в литтл индиане?
Brutalus вне форума Ответить с цитированием
Старый 07.06.2012, 14:29   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
В таком случае в переменной BigInd будет лежать весь тот файл в HEX'e и в литтл индиане?
разумеется, НЕТ!

Это пример чтения и перевода ОДНОЙ переменной (4 байта) из биг-эндиан в родной интеловский литл-эндиан.

а весь файл (в общем случае!!) вам и не нужно переводить! Там же не только числа могут быть. могут быть бинарные данные. строки, наконец. их конвертировать НЕ НУЖНО!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.06.2012, 17:22   #13
Brutalus
Пользователь
 
Регистрация: 07.06.2012
Сообщений: 10
По умолчанию

Так, уже есть некоторые успехи.
Код:
var
  Form1: TForm1;
  Header: String;
  Count: DWORD;
  SSFStream: TFileStream;
  ch: array[0..4] of Char;
implementation

{$R *.dfm}

function ReverseString(s: string): string;
var
  i: integer;
begin
  Result := '';
  if Trim(s) <> '' then
    for i := Length(s) downto 1 do
      Result := Result + s[i];
end;

function SwapEndian(Value: DWORD): DWORD; register; overload;
asm
  bswap eax
end;

procedure TForm1.btn_openssfClick(Sender: TObject);
begin
If FileExists(edit_ssfpath.Text) then
  Begin
  SSFStream:= TFileStream.Create(edit_ssfpath.Text, fmOpenReadWrite);
  SSFStream.Seek(0, soFromBeginning);
  SSFStream.Read(ch,4);
  SSFStream.Seek(12, soFromCurrent);
  SSFStream.Read(Count,4);
  Memo_Console.Lines.Add('Çàãîëîâîê "'+ReverseString(String(ch))+'" êîëëè÷åñòâî ôàéëîâ '+IntToStr(Count));
  SSFStream.Free;
  End;
end;

end.
Программа считывает всегдашнее начало ssf файла (53 45 43 20), и возможно корректно считывает количество файлов в архиве
Brutalus вне форума Ответить с цитированием
Старый 07.06.2012, 17:50   #14
Brutalus
Пользователь
 
Регистрация: 07.06.2012
Сообщений: 10
По умолчанию

Снова нужна помощь...
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    edit_ssfpath: TEdit;
    btn_openssf: TButton;
    Label1: TLabel;
    edit_header: TEdit;
    Memo_Console: TMemo;
    procedure btn_openssfClick(Sender: TObject);
    procedure GetFilesInfoFromSSF;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Header: String;
  Count, Size: DWORD;
  SSFStream: TFileStream;
  ch: array[0..4] of Char;
const
  BlockCount=1024;
  sBlockCount=2;
implementation

{$R *.dfm}

function ReverseString(s: string): string;
var
  i: integer;
begin
  Result := '';
  if Trim(s) <> '' then
    for i := Length(s) downto 1 do
      Result := Result + s[i];
end;

function SwapEndian(Value: DWORD): DWORD; register; overload;
asm
  bswap eax
end;

procedure TForm1.btn_openssfClick(Sender: TObject);
begin
If FileExists(edit_ssfpath.Text) then
  Begin
  SSFStream:= TFileStream.Create(edit_ssfpath.Text, fmOpenReadWrite);
  SSFStream.Seek(0, soFromBeginning);
  SSFStream.Read(ch,4);
  SSFStream.Seek(12, soFromCurrent);
  SSFStream.Read(Count,4);
  SSFStream.Read(Size,4);
  Memo_Console.Lines.Add('Заголовок "'+ReverseString(String(ch))+'" количество файлов '+IntToStr(Count)+' размер файла: '+IntToStr(Size));
  GetFilesInfoFromSSF;
  SSFStream.Free;
  End;
end;

procedure TForm1.GetFilesInfoFromSSF;
  var
  FileType:LongInt;
  FileOffset:LongInt;
  FileSize:LongInt;
  FileNameChr: array[0..23] of AnsiChar;
  FileIndex:LongInt;
begin
try
Begin
 for FileIndex := 0 to Count do
    Begin
    SSFStream.Seek(FileIndex*12,0);
    SSFStream.Read(FileType,4);    //Читаем тип файла
    SSFStream.Read(FileOffset,4);    //Читаем смещение файла
    SSFStream.Read(FileSize,4);   //Читаем размер файла
    Memo_Console.Lines.Add('Файл: Номер '+IntToStr(FileIndex)
      +'; Тип '+IntToStr(SwapEndian(FileType))
        +'; Размер '+IntToStr(SwapEndian(FileSize)*BlockCount)
          +'; Смещение '+IntToStr(SwapEndian(FileOffset)*BlockCount));

    End;
End;
end;


end.
Вот код. Почему-то выводит всякую фигню, помогите, исправьте. Вро де бы делал по той инфе что в первом посте.
Вот что прога выдаёт:
Заголовок "SEC " колличество файлов 13 размер файла: 16
Файл: Номер 0; Тип 541279571; Размер байт0; Смещение байт 0
Файл: Номер 1; Тип 3690987520; Размер байт0; Смещение байт 0
Файл: Номер 2; Тип 1586432; Размер байт536870912; Смещение байт 0
Файл: Номер 3; Тип 2158692608; Размер байт0; Смещение байт 1778511872
Файл: Номер 4; Тип 12060928; Размер байт1778511872;

Кроме того, он пробивает только 4 файла, а как показало первое считывание - их 13. Короче что-то я намутил...

Последний раз редактировалось Brutalus; 07.06.2012 в 17:54.
Brutalus вне форума Ответить с цитированием
Старый 07.06.2012, 19:59   #15
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Brutalus Посмотреть сообщение
Serge_Bliznykov, спасибо, я сам уже нашел.
Вопрос в том, как файл разом перевести в l-e.
Это невозможно.
В некоторых простых случаях, когда весь файл представляет собой однородный массив чисел известной разрядности - можно. А файл, имеющий внутреннюю структуру - нельзя.
s-andriano вне форума Ответить с цитированием
Старый 07.06.2012, 20:03   #16
Brutalus
Пользователь
 
Регистрация: 07.06.2012
Сообщений: 10
По умолчанию

Понятно .
Brutalus вне форума Ответить с цитированием
Старый 07.06.2012, 20:36   #17
Brutalus
Пользователь
 
Регистрация: 07.06.2012
Сообщений: 10
По умолчанию

Скажите, а как в Delphi 7 использовать UINT32? Компилер говорит, что такого типа нет.
Brutalus вне форума Ответить с цитированием
Старый 08.06.2012, 07:16   #18
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Это эквивалент типа Cardinal, 32-битовое число без знака.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с изменением формата даты при копировании из CSV формата в эксель mars56 Microsoft Office Excel 4 16.03.2010 09:50
Распаковка Dll Hookis1 Фриланс 9 09.03.2010 09:38
Распаковка архивов Starscream Общие вопросы Delphi 2 25.06.2009 23:26
Распаковка из .exe Satorin Общие вопросы Delphi 19 25.04.2009 18:46
распаковка .Jpeg vitality Мультимедиа в Delphi 12 08.02.2008 11:00