Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.26;
Скачать: CL | DM;

Вниз

Xor части файла   Найти похожие ветки 

 
KLAUS_   (2007-08-05 20:15) [0]

Всем привет!
Возникла проблемка на могу заксорить нужную часть файла, делаю так:

fs := TFileStream.Create(path+srec.name,fmOpenReadWrite);
 fs.Seek($00000000,soFromBeginning);
 str:=inttostr(fs.Read(b,sizeof(b)));
  for i:=1 to length(str) do
   str[i]:=Chr(Ord(str[i]) xor 1);
       fs.Seek($000000000,soFromBeginning);
    fs.Write(str,sizeof(str));
    fs.Free;

Файл считывается и даже значения меняются но как-то криво, и обратно не возвращается, подскажите где ошибка???  
b:=byte;


 
Anatoly Podgoretsky ©   (2007-08-05 20:25) [1]

Наверно str типа string


 
KLAUS_   (2007-08-05 20:37) [2]

Точно!!
И??


 
{RASkov} ©   (2007-08-05 20:45) [3]

> [2] KLAUS_   (05.08.07 20:37)
> Точно!!
> И??

Что должно в итоге получиться из [0] - я не понял...
Но вот так

> fs.Write(str,sizeof(str));

с учетом [1] - это ошибка.
Хотя у тебя длинна Str не будет больше 3, а SizeOf(String) = 4 то.....
В общем объясни, что в итоге хочешь?


 
KLAUS_   (2007-08-05 20:51) [4]

Для начало, чтоб в файле изменились данные  при

str[i]:=Chr(Ord(str[i]) xor 1);

Чтоб "KLAUS" стал "JM@TR" , ну это на примере, а так,  беру чать кода по нужному адресу, ксору его, данные меняются, ксорю ещё раз данные возвращаются...
ЧТО НЕ ПРАВИЛЬНО ДЕЛАЮ!!


 
{RASkov} ©   (2007-08-05 20:56) [5]

В общем:
fs := TFileStream.Create(path+srec.name,fmOpenReadWrite);
fs.Seek($00000000,soFromBeginning); <- Зачем? Оно и так в начале...
str:=inttostr(fs.Read(b,sizeof(b))); <- Вообще не понятен смысл этого.... в Str в виде строки сколько было считано байтов ?
Потом все символы в строке str "кодируем"
 for i:=1 to length(str) do
  str[i]:=Chr(Ord(str[i]) xor 1);
и сместившись на начало файла
fs.Seek($000000000,soFromBeginning);
пытаемся затереть все, что было и
fs.Write(str,sizeof(str));
записать 4 байта непонятной инфы...
Правильно ли я понял ?


 
{RASkov} ©   (2007-08-05 20:58) [6]

> [4] KLAUS_   (05.08.07 20:51)

Не заметил...[4].
Так тебе некие строки в файле нужно ксорить, но не весь файл..... или весь?


 
turbouser ©   (2007-08-05 21:00) [7]


> KLAUS_   (05.08.07 20:51) [4]

Посмотрел бы ты в хелпе - что такое sizeof и пример использования TFileStream


 
KLAUS_   (2007-08-05 21:01) [8]

Хм, планировалось так, от начала файла до нужного места:
str:=inttostr(fs.Read(b,sizeof(b))); - как мне казалось считываю файлы, а затем их ксорю!!
Косячу да??


 
KLAUS_   (2007-08-05 21:04) [9]

turbouser
Да как бы работал раньше, но дело не в этом ты по поводы вопросы говори, если есть что!


 
{RASkov} ©   (2007-08-05 21:06) [10]

> [8] KLAUS_   (05.08.07 21:01)

Вообще ничего не понял :(

> str:=inttostr(fs.Read(b,sizeof(b))); - как мне казалось считываю файлы

???? Может байты?

> Косячу да??

Походу...:)

[7] - почитай.

> [9] KLAUS_   (05.08.07 21:04)

Еще раз [7] почитай внимательно ) Или разъясняйся толковей...


 
{RASkov} ©   (2007-08-05 21:08) [11]

> [8] KLAUS_   (05.08.07 21:01)
> Хм, планировалось так, от начала файла до нужного места:

А как "нужное место" определяешь?


 
KLAUS_   (2007-08-05 21:10) [12]

{RASkov} Да байты байты, опечатался!
Хм, кажись и так уж всё расписал:
Нужно в нужном месте считать быйты и сксорить их.......
Покажите где я ошибся или подскажите что изменить, но только давайте не будем ПОЧИТАЙ  и т.п.
Давайте подскажем где и как!!


 
{RASkov} ©   (2007-08-05 21:12) [13]

> [12] KLAUS_   (05.08.07 21:10)

Ответь на [11]


 
KLAUS_   (2007-08-05 21:12) [14]

fs.Seek($000000000,soFromBeginning);
могу указать так <codefs.Seek($000000010,soFromBeginning);
т.е. смысл ясен думаю


 
turbouser ©   (2007-08-05 21:13) [15]


> KLAUS_   (05.08.07 21:10) [12]

Эхх.
str:=inttostr(fs.Read(b,sizeof(b)));
Ты читаешь 1 байт (символ), при этом в str что оказывается? Правильно - кол-во
причитанных байт. Т.е. 1.

fs.Write(str,sizeof(str));
И что тут должно записАться в файл? Правильно - 4 байта непонятно чего.
Все-таки последуй совету из [7]


 
Anatoly Podgoretsky ©   (2007-08-05 21:19) [16]

Нужно обращение к буферу, а не использование переменной в качестве буфера. Можно через приведение к PChar


 
{RASkov} ©   (2007-08-05 21:21) [17]

> [14] KLAUS_   (05.08.07 21:12)
> т.е. смысл ясен думаю

Нет :(
Откуда у тебя значение смещения? Или оно постоянное для файлов?

fs := TFileStream.Create(path+srec.name,fmOpenReadWrite);
for i:=1 to 5 do begin //Это и был вопрос про смещение, так как ты не ответал, то пусть будет 5 байт
 fs.Read(b,sizeof(b));
 b:=b xor 1;
 fs.Seek(fs.Position-1);
 fs.Write(b, SizeOf(b);
end;
fs.Free;


Так что ли? b: byte;


 
KLAUS_   (2007-08-05 21:23) [18]

turbouser Полностью согласен!!
Но вот как, пока не могу понять, поэтому и обратился!!

Anatoly Podgoretsky
Что именно, данные которые записываю, или место в файле куда хочу записать??


 
{RASkov} ©   (2007-08-05 21:29) [19]

> [18] KLAUS_   (05.08.07 21:23)
> Но вот как

ЧТО Как???
Строки писать нужно, например, так:
fs.write(Str[0], Length(Str));
а не указатель на строку в виде 4 байт, как это делаешь ты....


 
KLAUS_   (2007-08-05 21:32) [20]

{RASkov}
Не понял, считываю данные в файле, пускай они будут по адресу $000000010
, получаю (допустим) FF, перевожу в INT , получаю 255, перевожу в STR, теперь ксорю со смещением 1, получаю 344, перевожу в HEx, получаю 158 - вот я их  и хочу записать!!


 
Anatoly Podgoretsky ©   (2007-08-05 21:33) [21]

> KLAUS_  (05.08.2007 21:23:18)  [18]

Про данные речь, тебе еще везет, а может наоборот, что AV не получаешь.


 
Anatoly Podgoretsky ©   (2007-08-05 21:34) [22]

> {RASkov}  (05.08.2007 21:29:19)  [19]

Это даже не откомпилируется.


 
KLAUS_   (2007-08-05 21:35) [23]

Вот вот!!Согласен...
Что за AV??


 
{RASkov} ©   (2007-08-05 21:36) [24]

> [20] KLAUS_   (05.08.07 21:32)
> считываю данные в файле, пускай они будут по адресу $000000010

А длина этих данных какая??? откуда ты ее берешь?

И нафика столько всяких "переводов" туда-сюда??? Ты уже на этапе исходного кода пытаешься все "зашифровать"? :)


 
MetalFan ©   (2007-08-05 21:38) [25]


> fs.write(Str[0], Length(Str));

ай опять за старую песню? Str[1], и если уж на то пошло, то лучше не использовать идентификатор Str!


 
KLAUS_   (2007-08-05 21:39) [26]

{RASkov}Длина этих данных по этому адресу будет явно БАЙТ!!


 
{RASkov} ©   (2007-08-05 21:41) [27]

> [22] Anatoly Podgoretsky ©   (05.08.07 21:34)

Ага... та самая таблица, т.е. индексы
вместо Str[0] нужно Str[1])


 
{RASkov} ©   (2007-08-05 21:41) [28]

> [26] KLAUS_   (05.08.07 21:39)

Дык тебе один байт нужно сксорить????


 
Anatoly Podgoretsky ©   (2007-08-05 21:42) [29]

KLAUS_   (05.08.07 21:39) [26]
Минимум три


 
KLAUS_   (2007-08-05 21:43) [30]

Тогда изменится только первый байт, и то, только в одну сторону.обратно не переводится.........и при смещении 1, получается вообще другое значение!


 
Anatoly Podgoretsky ©   (2007-08-05 21:44) [31]

При этом читаем один байт, пишем в строку три, а в файл записываем четыре, при том не их, а черт знает что.


 
KLAUS_   (2007-08-05 21:44) [32]

Да мне вообще придётся пол файла ксорить......мне бы на примере хотя бб, чтоб один получилось, по нужному адресу!!


 
KLAUS_   (2007-08-05 21:45) [33]

Anatoly Podgoretsky ТОЧНО!!
Подскажи как исправить??


 
Anatoly Podgoretsky ©   (2007-08-05 21:47) [34]

> KLAUS_  (05.08.2007 21:45:33)  [33]

В ветке есть вся необходимая информация, что бы правильно написать.
Иначе стоит задуматься.


 
KLAUS_   (2007-08-05 21:50) [35]

Шикарный ответ!


 
{RASkov} ©   (2007-08-05 21:51) [36]

> [26] KLAUS_   (05.08.07 21:39)

<Вот это данные файла>
Например нужно зашифровать <данные>, так вот они находятся по смещению от начала файла 9 байт и имеют длинну 6 байт....
Как ты определяешь 9 и 6 ???? И зачем строки при этом использовать?? Ты-ж с байтами работаешь....


 
KLAUS_   (2007-08-05 21:55) [37]

Ну я бы определил так, от начала файла 9+6, вот эти от 9 до 15 шифровал бы!!
НО ВОТ КАК!!! Ну получается у меня байты  заксорить......
Мог бы не обратился бы за помощью


 
{RASkov} ©   (2007-08-05 21:58) [38]

> [37] KLAUS_   (05.08.07 21:55)

Еще раз:

fs := TFileStream.Create(path+srec.name,fmOpenReadWrite);
fs.Seek(<Начало>, soFromBeginning);
for i:=1 to <Длина> do begin
fs.Read(b,sizeof(b));
b:=b xor 1;
fs.Seek(fs.Position-1, soFromBeginning);
fs.Write(b, SizeOf(b);
end;
fs.Free;


 
MetalFan ©   (2007-08-05 22:08) [39]


> fs.Seek(fs.Position-1, soFromBeginning);

а можно fs.Seek(-1, soFromCurrent);


 
KLAUS_   (2007-08-05 22:14) [40]

{RASkov} ВОТ!!
СПАСИБО ДРУГ, реально помог!!

MetalFan
ТОЖЕ ПРИКОЛЬНО!!

ВСЕМ СПАСИБО!!!


 
{RASkov} ©   (2007-08-05 22:15) [41]

> а можно fs.Seek(-1, soFromCurrent);

Можно.... разрешаю :)
Там еще много чего можно, делайте что хотите :о)


 
{RASkov} ©   (2007-08-05 22:19) [42]

> [40] KLAUS_   (05.08.07 22:14)
> {RASkov} ВОТ!!
> СПАСИБО ДРУГ,

А сам бы до этого не додумался бы? Даже если перечитать пару раз ветку....?

реально помог!!

Я рад.... думал не получится уже :)


 
KLAUS_   (2007-08-05 22:25) [43]

Реально я сделал, уже так

var
b: array[1..5]of byte;
        BEGIN
   form1.ListBox1.items.Add(path+srec.name);
fs := TFileStream.Create(path+srec.name,fmOpenReadWrite);
fs.Seek($00000000,soFromBeginning);
fs.Read(b,sizeof(b));
for i:=1 to sizeof(b) do
b[i]:=b[i] xor 1;
fs.Seek($000000000,soFromBeginning);
fs.Write(b,sizeof(b));
fs.Free;

Но твой вариант по удачней оказался!!


 
KLAUS_   (2007-08-05 22:26) [44]

Хотя смысл почти тот же.........
СПАСИБО ЗА ПОМОЩЬ!!!
Без тебя бы не получилось............


 
Anatoly Podgoretsky ©   (2007-08-05 22:41) [45]

> {RASkov}  (05.08.2007 22:19:42)  [42]

Так и не получилось, ты просто дал готовый код, остальное насмарку.


 
{RASkov} ©   (2007-08-05 23:20) [46]

> [45] Anatoly Podgoretsky ©   (05.08.07 22:41)
> Так и не получилось, ты просто дал готовый код, остальное насмарку

:)
Не думаю, что все именно так.... судя по [43] - чел что-то делал, и если не мой код, то и остался бы при своем мнении, т.е. использовать код из [43]
Ведь он тоже рабочий... хоть и не так интуитивно понятный(по крайней мере мне), но рабочий.... А так ему есть что с чем сравнить и сделать выводы....
Впрочем я и в самом деле не ожидал, что именно это ему и надо, так как он толком не мог объяснить, что ему вообще нужно, оказалось - угадал.
Я не против давать код, лишь бы код пошел на пользу другим, не обязательно авторам ветки....
А учением с нуля и "словами" не всегда есть хорошо и не всегда на форуме этим заниматься... и поэтому частенько просто решаю проблему с автором и все...
Если я чем-то нарушаю правила форума(или еще чего), скажите.

ЗЫ Я ни кого не хочу ни чему учить, просто показываю иногда дорогу, И придерживаюсь мнения: Кто хочет - тот научится, а кому это не надо, тот один хер откуда-нибудь скопипастит себе кусок кода, не поняв сути в нем и останется тем же неучем, кем и был до копипаста.

ЗЫЫ Впрочем в данном случае, наверное [45] - верно :) Так, как этот код я дал еще в [17], а автор не удосужился чуть-чуть его подправить....:(



Страницы: 1 2 вся ветка

Текущий архив: 2007.08.26;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.033 c
2-1185783064
TStas
2007-07-30 12:11
2007.08.26
Secondary shortcut


2-1185692141
***mikle***
2007-07-29 10:55
2007.08.26
Как реализовать окно с текстом и картинками?


15-1185371357
Галинка
2007-07-25 17:49
2007.08.26
Посоветуйте книгу по Си


2-1185116500
tabul
2007-07-22 19:01
2007.08.26
Как сделать что бы тест написанный в Delphi работал на компьютер


2-1185790796
pukin
2007-07-30 14:19
2007.08.26
Найду ли я динамически созданный компонент?