Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 10.04.2014, 00:24   #11
SDK
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Такого примера нет в природе. И отсутствие смещения как такового не значит, что его нельзя вычислить, зная устройство файла. Вычислите смещение 1-го. Тогда скорее всего прибавив к нему длину первого получите смещение 2-го и т.д. Но повторяю - скорее всего, т.к. не знаю устройство файла
Ну тогда еще и размер файла придется высчитывать так как размеры даются с заголовком, и предыдущими файлами, в этом и проблема.
В бщем размер каждого файла дается как бы так сказать (от нулевой точки).

Последний раз редактировалось SDK; 10.04.2014 в 00:30.
SDK вне форума   Ответить с цитированием
Старый 10.04.2014, 09:41   #12
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,917
Репутация: 2242
По умолчанию

Цитата:
дело в том что известен только размер файлов причем вместе с заголовком и предыдущим файлом.
может все-таки известна пара (начало-конец)

заголовок =начало первого
файл1 = конец первого =начало второго
файл2 =конец второго =начало второго
файл3 =конец третьего =начало четвертого
.....
файл последний =конец предпоследнего = ??? (разумно предположить = общий объем архива)

M1 (...F1...) M2 (...F2...) M3 (...F3...) M4 (...F4...) ???

F1 =(M1, M2)
F2 =(M2, M3)
F3 =(M3, M4)
F4 =(M4, ???)
__________________
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.04.2014 в 09:46.
evg_m вне форума   Ответить с цитированием
Старый 10.04.2014, 23:53   #13
SDK
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
может все-таки известна пара (начало-конец)
ну в общем со смещением оказалось все просто, как то сразу не подумал, смещение первого файла будет конец заголовка, смещение второго файла будет конец первого, и т.д ( я по ссылке попадаю в нужный offset, далее прибавляю размер заголовка, получаю offset первого файла и т.д), я только не пойму как программно высчитать настоящий размер файла, можно конечно написать для первого файла (размер файла1 минус заголовок), для второго файла (размер файла2 минус размер файла1 и минус заголовок и т.д) Но если будет 100 или более файлов этож сколько писать, как это сделать по простому?
SDK вне форума   Ответить с цитированием
Старый 10.04.2014, 23:56   #14
SDK
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 12
Репутация: 10
По умолчанию

Вот еще раз попробую объяснить структуру на примере трех файлов


------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------
SDK вне форума   Ответить с цитированием
Старый 11.04.2014, 00:12   #15
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
Репутация: 108
По умолчанию

SDK Если известно, что где находится, в чём собственно загвоздка? И не понимаю зачем что-то от чего-то отнимать? Ставь позицию memorystream в начало файла, вычитывай его по длине, далее с оконечной позиции вычитывай следующий файл, и т.д.

Последний раз редактировалось XE5; 11.04.2014 в 00:15.
XE5 вне форума   Ответить с цитированием
Старый 11.04.2014, 01:01   #16
SDK
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 12
Репутация: 10
По умолчанию

Цитата:
Сообщение от XE5 Посмотреть сообщение
SDK Если известно, что где находится, в чём собственно загвоздка? И не понимаю зачем что-то от чего-то отнимать? Ставь позицию memorystream в начало файла, вычитывай его по длине, далее с оконечной позиции вычитывай следующий файл, и т.д.
Дело в том что я никак не пойму как высчитать размер.
SDK вне форума   Ответить с цитированием
Старый 11.04.2014, 01:44   #17
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Адрес: RF Moscow
Сообщений: 5,408
Репутация: 2502

icq: 438888048
По умолчанию

Даны числа "a", "b", "c", "d", где "a" - размер заголовка, "b", "c", "d" - размеры файлов, записанные в заголовке, тогда реальные размеры файлов: "b-a", "c-b", "d-c".
__________________
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума   Ответить с цитированием
Старый 11.04.2014, 13:07   #18
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
Репутация: 108
По умолчанию

Цитата:
Сообщение от SDK Посмотреть сообщение
Дело в том что я никак не пойму как высчитать размер.
Если тебе известно, где начинается каждый следующий файл, и начало следующего файла идёт сразу после предыдущего, то размер файла равен позиции начала следующего файла минус позиции начала предыдущего файла. Считай.
XE5 вне форума   Ответить с цитированием
Старый 02.05.2014, 01:43   #19
SDK
Пользователь
 
Регистрация: 21.01.2008
Сообщений: 12
Репутация: 10
По умолчанию

Всем спасибо за помощь распаковщик написал, теперь обратная проблема, написать запаковщик.
вот процедура распаковки, может кому пригодится
Цитата:
Z:=0;

Seek(RFile, FOff + 12);
For I:=1 To TF Do
Begin
Z:=Z+1;
Q2:=FloatToStr(Z);
FPos:=FilePos(RFile);

BlockRead(RFile, Offs, 4); // смещение файла }
BlockRead(RFile, FSz, 4); // размер файла }
FPos:=FilePos(RFile);
FSz := FSz - Offs;
FOffs := FOff + 12;
Label4.Caption := inttostr(FSz);
Seek(RFile, Offs + FOffs);
GetMem(P, FSz);
BlockRead(RFile, P^, FSz);
AssignFile(F, '1_' + Q2);
ReWrite(F, 1);
BlockWrite(F, P^, FSz);
CloseFile(F);
FreeMem(P, FSz);

Seek(RFile, FPos-4);

end;
SDK вне форума   Ответить с цитированием
Старый 02.05.2014, 23:04   #20
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Адрес: RF Moscow
Сообщений: 5,408
Репутация: 2502

icq: 438888048
По умолчанию

Код:
procedure TForm1.encodeClick(Sender: TObject);
var
  output_file, input_file: TFileStream;
  st: TStringList;
  header_info: array of DWORD;
  i: integer;
begin
  st := TStringList.Create;
  st.Add('1.png');
  st.Add('2.png');
  st.Add('3.jpg');
  output_file := TFileStream.Create('output.bin', fmCreate);
  SetLength(header_info, st.Count + 1);
  header_info[0] := length(header_info) * SizeOf(header_info[0]);
  output_file.Write(header_info[0], header_info[0]);
  for i := 0 to st.count - 1 do
  begin
    input_file := TFileStream.Create(st[i], fmOpenRead);
    output_file.CopyFrom(input_file, input_file.Size);
    header_info[i + 1] := output_file.Size;
    input_file.Free;
  end;
  output_file.Seek(0, soBeginning);
  output_file.Write(header_info[0], header_info[0]);
  SetLength(header_info, 0);
  output_file.Free;
  st.Free;
end;

procedure TForm1.decodeClick(Sender: TObject);
var
  output_file, input_file: TFileStream;
  header_info: array of DWORD;
  tmp: DWORD;
  i, count: integer;
begin
  input_file := TFileStream.Create('input.bin', fmOpenRead);
  input_file.read(tmp, SizeOf(tmp));
  count := tmp div SizeOf(tmp) - 1;
  SetLength(header_info, count + 1);
  header_info[0] := tmp;
  input_file.read(header_info[1], count * SizeOf(header_info[0]));
  for i := 1 to count do
  begin
    output_file := TFileStream.Create(IntToStr(i) + '.bin', fmCreate or fmOpenWrite);
    output_file.CopyFrom(input_file, header_info[i] - header_info[i - 1]);
    output_file.Free;
  end;
  SetLength(header_info, 0);
  input_file.Free;
end;
__________________
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 02.05.2014 в 23:09.
BDA вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распаковщик файла .sf darkdoren Общие вопросы C/C++ 4 03.08.2013 13:25
Распаковщик-конвертер 3д формата типа .dff Brutalus Фриланс 0 17.11.2012 13:13
Хочу написать распаковщик формата Anton911 Общие вопросы Delphi 4 05.05.2012 10:43
bash-распаковщик архивов SNake Ice Помощь студентам 0 02.04.2011 04:31
Нужен распаковщик .ехе файлов Veselyn Софт 3 03.05.2009 06:24


06:22.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.