Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Вниз

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
ТОЖЕ ПРИКОЛЬНО!!

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



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

Форум: "Начинающим";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.049 c
2-1185777100
johntemp
2007-07-30 10:31
2007.08.26
TExcelApplication в Delphi 3?


2-1185190388
***mikle***
2007-07-23 15:33
2007.08.26
как узнать с какого IP пришло сообщение на ServerSocket


15-1185270324
DillerXX
2007-07-24 13:45
2007.08.26
Восход Эндимиона - это последняя книга?


15-1185406537
Альберт
2007-07-26 03:35
2007.08.26
cmd.exe ...


2-1186383821
Kolan
2007-08-06 11:03
2007.08.26
SHFileOperation иногда ругается &amp;laquo;Не могу скопировть&amp;raquo;





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский