Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > XOR нужной части файла


Автор: _KLAUS_ 7.8.2007, 14:57
Всем привет!!
Нужна помощь, пытаюсь заксорить файл, точнее нужное кол-во байт в файле.
кол-во равное "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;



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

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1186330517&n=18

Автор: MetalFan 7.8.2007, 15:34
Цитата(_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;

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

Автор: _KLAUS_ 7.8.2007, 16:23
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

Автор: aktuba 7.8.2007, 16:37
Ну ты молодец  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...

Автор: _KLAUS_ 7.8.2007, 16:45
aktuba, 
БЛИН!!
Спасибо!! smile 

Автор: _KLAUS_ 7.8.2007, 17:01
Цитата(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 
укажите на ошибку!!

Автор: aktuba 7.8.2007, 18:11
Цитата

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;

Автор: _KLAUS_ 7.8.2007, 18:17
aktuba, 
Уууууу, мда....... smile 

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

Автор: aktuba 7.8.2007, 19:16
Цитата

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


А просто  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;


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

Автор: _KLAUS_ 7.8.2007, 19:42
aktuba, 
ВООБЩЕ СУППЕР- СПАСИБО!!!!! smile

Добавлено через 1 минуту
ВСЕМ СПАСИБО!!

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

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

Автор: aktuba 7.8.2007, 20:42
Цитата

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


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

Автор: demm 16.8.2007, 11:57
извините, немного не в тему:

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

Код

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

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

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

if size > 1000000 then
  size := 1000000;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)