Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XOR нужной части файла, XOR нужной части файла 
V
    Опции темы
_KLAUS_
Дата 7.8.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2006

Репутация: нет
Всего: нет



Всем привет!!
Нужна помощь, пытаюсь заксорить файл, точнее нужное кол-во байт в файле.
кол-во равное "size", но кодирутеся только 255 байт??
Как исправить??

 
Код

var
      b,i:  byte;
      size: Integer;
      buf: Pbytearray;
         BEGIN
    fs := TFileStream.Create(path+srec.name,fmOpenReadWrite);
    size:=fs.Size;
     while size > 1000000 do  begin
      size:= size div 2      ;
   end  ;
    fs.Seek($000000000, soFromBeginning);
    for i:=1 to size do begin
    fs.Read(b,sizeof(b));
    b:=b xor (strtoint(Form1.Edit2.Text));
    fs.Seek(fs.Position-1, soFromBeginning);
    fs.Write(b, SizeOf(b));
  end;
    fs.Free;
     END;



PM MAIL   Вверх
Yanis
Дата 7.8.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



Процитирую хорошую фразу, хорошего человека:
Цитата
Anatoly Podgoretsky ©   (05.08.07 21:47) [34]
> KLAUS_  (05.08.2007 21:45:33)  [33]
В ветке есть вся необходимая информация, что бы правильно написать.
Иначе стоит задуматься.

http://www.delphimaster.ru/cgi-bin/forum.p...330517&n=18


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 7.8.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(_KLAUS_ @  7.8.2007,  14:57 Найти цитируемый пост)
кол-во равное "size", но кодирутеся только 255 байт??

видимо size = 255?

ужасное оформление кода или у меня браузер отображает криво? выравнивание кривое.
1) 
Цитата(_KLAUS_ @  7.8.2007,  14:57 Найти цитируемый пост)
 while size > 1000000 do  begin
      size:= size div 2      ;
   end  ;

эт что за бред?
2) 
Цитата(_KLAUS_ @  7.8.2007,  14:57 Найти цитируемый пост)
fs.Seek($000000000, soFromBeginning);

нафиг столько нулей? типо чем больше тем круче чтоль? "0" вполне хватило бы.

3)
Цитата(_KLAUS_ @  7.8.2007,  14:57 Найти цитируемый пост)
b:=b xor (strtoint(Form1.Edit2.Text));

нафиг при каждой итерации столько телодвижений? перед запуском цикла вычислить один раз и хва.


4)
Цитата(_KLAUS_ @  7.8.2007,  14:57 Найти цитируемый пост)
buf: Pbytearray;

это хто за нафиг?

Это сообщение отредактировал(а) MetalFan - 7.8.2007, 15:35


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
_KLAUS_
Дата 7.8.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2006

Репутация: нет
Всего: нет



MetalFan
Да 255, а должен быть
Код

 fs := TFileStream.Create(path+srec.name,fmOpenReadWrite);
 size:=fs.Size;

т.е. размер файла считал, вот столько и надо
1)
Код

while size > 1000000 do  begin
      size:= size div 2      ;
   end  ;


Ну этотипа, чтоб не больше 1 метра был!![
code=delphi]
buf: Pbytearray;
[/code]
Я его в буфер кидал и там пытался типа:
Код

 getmem(buf,size) ;
  fs.Seek($0, soFromBeginning);
   for i:=1 to size do begin
    fs.Read(buf^,size);
     buf[i]:=buf^[i] xor (strtoint(Form1.Edit2.Text));
    fs.Seek(fs.Position-1, soFromBeginning);
    fs.Write(buf[i],Sizeof(buf[i]));

Но какой-то бред получается, всяко разно пытался.......... smile 
HELP
PM MAIL   Вверх
aktuba
Дата 7.8.2007, 16:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 7
Всего: 38



Ну ты молодец  smile 
Код

var
  b,i:  byte;
  size: Integer;
begin
  fs := TFileStream.Create(path+srec.name,fmOpenReadWrite);
  size:=fs.Size;
  ...
  for i:=1 to size do begin
  ...


Ничего не напоминает??? У тебя i - byte...

P.S.: вообще класно получается - Int64 -> Integer -> Byte...

Это сообщение отредактировал(а) aktuba - 7.8.2007, 16:38


--------------------
user posted image
PM MAIL WWW Skype   Вверх
_KLAUS_
Дата 7.8.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2006

Репутация: нет
Всего: нет



aktuba
БЛИН!!
Спасибо!! smile 
PM MAIL   Вверх
_KLAUS_
Дата 7.8.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2006

Репутация: нет
Всего: нет



Цитата(MetalFan @ 7.8.2007,  15:34)


3)
b:=b xor (strtoint(Form1.Edit2.Text));

нафиг при каждой итерации столько телодвижений? перед запуском цикла вычислить один раз и хва.


[/QUOTE]
каким образом? Он же каждый байт должен ксорить и одинаковом значении?? Или как-то по другому можно??
Подскажи!!

Добавлено через 2 минуты и 24 секунды
Код

   fs.Read(buf^,size);
    b:=buf^[i] xor (strtoint(Form1.Edit2.Text));
     fs.Seek(fs.Position-1, soFromBeginning);
     fs.Write(buf^,Sizeof(b));


Ну и всй таки пытаюсь сделать, чтоб всё происходило в буфере....но опять косяк smile 
укажите на ошибку!!
PM MAIL   Вверх
aktuba
Дата 7.8.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 7
Всего: 38



Цитата

b:=b xor (strtoint(Form1.Edit2.Text));


вычисли strtoint(Form1.Edit2.Text) один раз и используй результат! И массив немного переделал бы:
Код

c := strtoint(Form1.Edit2.Text);
for i:=0 to size - 1 do
  begin
    fs.Read(b,sizeof(b));
    b:=b xor c;
    fs.Position := i;
    fs.Write(b, SizeOf(b));
  end;



--------------------
user posted image
PM MAIL WWW Skype   Вверх
_KLAUS_
Дата 7.8.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2006

Репутация: нет
Всего: нет



aktuba
Уууууу, мда....... smile 

А как насчёт буфера?? smile 
PM MAIL   Вверх
aktuba
Дата 7.8.2007, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 7
Всего: 38



Цитата

А как насчёт буфера??


А просто  smile Ты для буфера место в памяти выделяешь/освобождаешь? Судя по коду - нет, отсюда и глюки =))) Кстати, я так понял, ты хочешь весь файл считать в память и проксорить его, а уже потом сохранить его снова в файл. Это не очень хорошо. Лучше так:
Код

const
  C_Size = 1024;
var
  fs: TFileStream;
  lBuf: PByteArray;
  lSize: Integer;
  iPos: Integer;
  Idx: Integer;
begin
  fs := TFileStream.Create('c:\temp.txt', fmOpenReadWrite);
  lBuf := GetMemory(C_Size);
  try
    iPos := 0;
    while iPos < fs.Size do
      begin
        lSize := fs.Read(lBuf^, C_Size);
        for Idx := 0 to lSize - 1 do
          lBuf^[Idx] := lBuf^[Idx] xor 127;
        fs.Position := iPos;
        fs.Write(lBuf^, lSize);
        Inc(iPos, lSize);
      end;
  finally
    FreeMemory(lBuf);
    fs.Free;
  end;
end;


Писал на коленке, т.ч. оптимизируй сам...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
_KLAUS_
Дата 7.8.2007, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.11.2006

Репутация: нет
Всего: нет



aktuba
ВООБЩЕ СУППЕР- СПАСИБО!!!!! smile

Добавлено через 1 минуту
ВСЕМ СПАСИБО!!
PM MAIL   Вверх
MetalFan
Дата 7.8.2007, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



а чтоб не напрягаться с выделением памяти, можно сделать еще проще:
Код

const
  C_Size = 1024;
var
  fs: TFileStream;
  lBuf: array[0..C_Size-1] of byte;
  lSize: Integer;
  iPos: Integer;
  Idx: Integer;
begin
  fs := TFileStream.Create('c:\temp.txt', fmOpenReadWrite);
  try
    iPos := 0;
    while iPos < fs.Size do
      begin
        lSize := fs.Read(lBuf[0], C_Size);
        for Idx := 0 to lSize - 1 do
          lBuf[Idx] := lBuf[Idx] xor 127;
        fs.Position := iPos;
        fs.Write(lBuf[0], lSize);
        Inc(iPos, lSize);
      end;
  finally
    fs.Free;
  end;
end



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
aktuba
Дата 7.8.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 7
Всего: 38



Цитата

а чтоб не напрягаться с выделением памяти, можно сделать еще проще


Да, но в моем случаем, можно в зависимости от размера файла (или от других параметров) менять размер буфера  smile 


--------------------
user posted image
PM MAIL WWW Skype   Вверх
demm
Дата 16.8.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 12.7.2007

Репутация: нет
Всего: нет



извините, немного не в тему:

Цитата(_KLAUS_ @ 7.8.2007,  17:23)

Код

while size > 1000000 do  begin
      size:= size div 2      ;
   end  ;

Ну этотипа, чтоб не больше 1 метра был!!

а не лучше?
Код

if size > 1000000 then
  size := 1000000;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0875 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.