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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2013, 13:06   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию РазXORивание большого файла

Доброго времени суток!

Имеется некий файл, который просто "зашифрован" XOR'ом.
Нужно его расшифровать. Файл не шибко большой - 105 Мб.

Вот должно работать:
Код:
var
  FS, ffs: TFileStream;
  i, ilen: NativeInt;
  Buff: PChar;

begin
  FS := TFileStream.Create('F:\file.dat', fmOpenReadWrite);
  try
    FS.Seek(0, soFromBeginning);
    ilen := FS.Size;
    GetMem(Buff, FS.Size);
    FS.Read(Buff^, ilen);
    try
      for i := 0 to FS.Size do
      begin
        Buff[i] := chr(Ord(Buff[i]) xor 45);
        if Buff[i] = #0 then
          Buff[i] := ' ';
      end;
      ffs := TFileStream.Create('F:\file_encoded.dat',
        fmCreate or fmOpenReadWrite);
      try
        ffs.Write(Buff^, FS.Size);
      finally
        FreeAndNil(ffs);
      end;
    finally
      FreeMem(Buff);
    end;
  finally
    FreeAndNil(FS);
  end;
end;
В цикле, внезапно вылетает ошибка записи в память. В Чем причина?
Человек_Борща вне форума Ответить с цитированием
Старый 18.05.2013, 16:56   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
 for i := 0 to FS.Size - 1 do
Наверное, это.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 19.05.2013, 10:54   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Нет, не помогло.
Цикл, самое интересное, всегда обрывается на одно и том же числе: 53018160
Человек_Борща вне форума Ответить с цитированием
Старый 19.05.2013, 11:08   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Char сикока байт занимает?
Код:
 Buff: PByte;
...
      for i := 0 to FS.Size-1 do
      begin
        Buff[i] := Buff[i] xor 45;
        if Buff[i] = 0 then
          Buff[i] := 32;
      end;
...
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 19.05.2013 в 11:15. Причина: Убрал ORD
Аватар вне форума Ответить с цитированием
Старый 19.05.2013, 22:56   #5
iworm2009
Пользователь
 
Регистрация: 07.05.2013
Сообщений: 51
По умолчанию

В продолжение поста выше))
Выдержка из справки

TStream is the base class type for stream objects that can read from or write to various kinds of storage media, such as disk files, dynamic memory, and so on.

Use specialized stream objects to read from, write to, or copy information stored in a particular medium. Each descendant of TStream implements methods for transferring information to and from a particular storage medium, such as a disk file, dynamic memory, and so on. In addition to methods for reading, writing, and copying bytes to and from the stream, stream objects permit applications to seek to an arbitrary position in the stream. Properties of TStream provide information about the stream, such as its size and the current position in the stream.

если у вас PChar = ^Char, а Char = WideChar, то все справедливо.
iworm2009 вне форума Ответить с цитированием
Старый 20.05.2013, 19:43   #6
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Везде замените строковые типы данных на однобайтовый ansichar. И настораживает родной для х86 тип nativeint... каков у него диапазон?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 21.05.2013, 15:16   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

А что можно придумать если файл размером 2-3 гб?

Оперативы у меня свободной, есть 5 Гб. Но если файл больше 1 гб, то вылетает с Out Of Memory. Стэк увеличивал до 100 мб, толку 0.
Человек_Борща вне форума Ответить с цитированием
Старый 21.05.2013, 15:21   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Читать в буфер, ксорить буфер, писать буфер.
Повторять, пока файл не кончится.
(Буфер фиксированного размера)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 21.05.2013, 16:17   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Нашел способ проще:
Memory Mapped Files(Чтение) + TFileStream(запись)
Человек_Борща вне форума Ответить с цитированием
Старый 21.05.2013, 16:47   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Нашел способ проще
Чем он проще?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
импорт данных из большого txt файла Неологист Microsoft Office Excel 14 28.09.2011 18:45
Запись большого файла на 2-ва DVD Rembo Софт 32 14.02.2009 16:02
Сохранение большого файла в WinWORD 2003 alex_z_ua Microsoft Office Word 1 23.09.2008 18:54
Проблема с записью большого файла Rembo Свободное общение 17 17.06.2008 12:47