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

Вниз

Кодирование   Найти похожие ветки 

 
borg   (2003-06-02 06:19) [0]

Народ подскажите кто знает что делает код #10. Если его сохраняешь в файл или отображаешь например в МЕМО то к нему автоматически добавляется ещё и код #13. почему так происходит? мне для шифрования необходимо этот код сохранять а я не могу его сохранить не нарушив порядок битов в файле. Кто знает как этого избежать плизз хелп.


 
Poirot   (2003-06-02 06:40) [1]

Так ты зачем из мемо-то кодируешь? Естественно будет добавляться - аля Мастдай! Читай из файла любым побпайтовым способом: Потоки, БлокРеад и т.п. И соответственно пиши в файл так же!
Почему-то все начинают что-нить кодировать черех строки и мемо - типа глядите какой я умный....


 
borg   (2003-06-02 07:02) [2]

>>Poirot ©
>>Почему-то все начинают что-нить кодировать черех строки и >>мемо - типа глядите какой я умный....

var rascod:string;
........
assignfile(f,"c:\123.txt");
rewrite(f);
for i:=1 to length(raskod) do
write(f,raskod[i]);


если сохранять так, то тоже самое получается. из файла я читаю его кодирую раскодирование тоже работает нормально, но при сохранении раскодированного текста я не могу добится что бы не вставлялся #13. Может посоветуешь как ещё из string сохранить в файл.


 
Anatoly Podgoretsky   (2003-06-02 07:32) [3]

Не происходит такого, сохраяется как есть, без фокусов.


 
Poirot   (2003-06-02 07:42) [4]

Попробуй не юзать текстовый файл! Кстати - РАБОТАЕТ ТВОЙ КОД!
Пиши BlockWrite!(RTFM)


 
xbop   (2003-06-02 09:30) [5]

код #10-перевод строки
код #13-возврат каретки ...

А вместе это переход на новую строчку в текствых файлах ...
попробуй пользовать файлы типа byte ... там точно проблемм не будет


 
borg   (2003-06-02 14:12) [6]

Что такое файлы типа байт?

Выполняя этот код текстовый файл уменьшается в размере иногда даже на несколько десятков бит.

procedure TForm1.Button2Click(Sender: TObject);
var i:integer; s:string; f: system.text;
begin
S:=memo1.text;
for i:=1 to length(S) do
s[i]:=Chr(Ord(S[i]) xor 5);

assignfile(f,"m:\"+edit1.text+".test");
Rewrite(f);
for i:=0 to length(S) do write(f,s[i]);
memo2.Text:=s;


Вроде всё правильно и как вы пишите код рабочий но при расшифровки исходный текст не возвращается. Может я что то где то напутал или до конца не понимаю. Помогите


 
Serginio   (2003-06-02 14:18) [7]

Для лучшего понимания посмотри исходники TstringList. LoadFromFile и SaveToFile и все вопросы будут решены.


 
borg   (2003-06-02 14:25) [8]

>>Serginio

Посмотрел и что в них такого особенного сохраняет данные через поток или я что то сильно не догоняю или там нет для меня ни чего полезного, если можешь объсни подробнее


 
Skier   (2003-06-02 14:31) [9]

>borg (02.06.03 14:25)

By Marko Cantu


unit EncodStr;

interface

uses
Classes;

type
TEncodedStream = class (TFileStream)
private
FKey: Char;
public
constructor Create(const FileName: string; Mode: Word);
function Read(var Buffer; Count: Longint): Longint; override;
function Write(const Buffer; Count: Longint): Longint; override;
property Key: Char read FKey write FKey default "A";
end;

implementation

constructor TEncodedStream.Create(
const FileName: string; Mode: Word);
begin
inherited Create (FileName, Mode);
FKey := "A";
end;

function TEncodedStream.Write(const Buffer;
Count: Longint): Longint;
var
pBuf, pEnc: PChar;
I, EncVal: Integer;
begin
// allocate memory for the encoded buffer
GetMem (pEnc, Count);
try
// use the buffer as an array of characters
pBuf := PChar (@Buffer);
// for every character of the buffer
for I := 0 to Count - 1 do
begin
// encode the value and store it
EncVal := ( Ord (pBuf[I]) + Ord(Key) ) mod 256;
pEnc [I] := Chr (EncVal);
end;
// write the encoded buffer to the file
Result := inherited Write (pEnc^, Count);
finally
FreeMem (pEnc, Count);
end;
end;

function TEncodedStream.Read(var Buffer; Count: Longint): Longint;
var
pBuf, pEnc: PChar;
I, CountRead, EncVal: Integer;
begin
// allocate memory for the encoded buffer
GetMem (pEnc, Count);
try
// read the encoded buffer from the file
CountRead := inherited Read (pEnc^, Count);
// use the output buffer as a string
pBuf := PChar (@Buffer);
// for every character actually read
for I := 0 to CountRead - 1 do
begin
// decode the value and store it
EncVal := ( Ord (pEnc[I]) - Ord(Key) ) mod 256;
pBuf [I] := Chr (EncVal);
end;
finally
FreeMem (pEnc, Count);
end;
// return the number of characters read
Result := CountRead;
end;



end.


 
borg   (2003-06-02 14:54) [10]

Почему вообще так происходит данные теряются при сохранении в файл?


 
Anatoly Podgoretsky   (2003-06-02 14:56) [11]

Видимо не текстовые.


 
Serginio   (2003-06-02 15:03) [12]

Можешь изменить sLineBreak или использовать свойсто Text(SetText).


 
borg   (2003-06-02 15:04) [13]

Нет файл как раз текстовый, при кодировании размер остаётся тот же а вот при сохранении в файл байты теряются. К примеру бвло 5520 байт стало 5504 почему так?


 
Serginio   (2003-06-02 15:10) [14]

Вернее напиши свой алгоритм сохранения строк разделенными #10 а для загрузки из такой строки как раз подходит Text он пропускает
#10,#13. Лучше написать своего наследника. Очень просто.


 
borg   (2003-06-02 17:29) [15]

Пожалуйста помогите кто-нибудь!!! НИЧЕГО НЕ ПОЛУЧАЕТСЯ!!! КАК СОХРАНИТЬ В ФАЙЛ ИЗ СТРИНГОВОЙ ПЕРЕМЕННОЙ. АВТОМАТИЧЕСКИ ДОБАВЛЯЕТСЯ КОД #13, ИЗ-ЗА ОСОБЕННОСТИ ПРОГРАММЫ НЕОБХОДИМО СОХРАНЯТЬ ИЗ СТРИНГОВОЙ ПЕРЕМЕННОЙ.


 
borg   (2003-06-02 17:34) [16]

еСЛИ НЕ ЛЕНЬ ПОЮЗАЙТЕ ЭТОТ КОД
const Ettalon:array[1..256] of byte=(
106, 38, 54, 161, 46, 244, 31, 75, 212, 230, 99, 193, 209, 58, 44, 215, 139, 35, 66, 146, 180, 121, 173,
194, 241, 74, 170, 12, 134, 13, 25, 122, 8, 82, 115, 182, 145, 61, 21, 195, 130, 129, 169, 26, 111, 219,
204, 45, 140, 218, 155, 86, 152, 214, 55, 92, 64, 196, 80, 137, 101, 34, 69, 255, 156, 234, 142, 90,
125, 206, 208, 249, 91, 20, 149, 163, 238, 235, 201, 167, 178, 226, 83, 88, 114, 186, 49, 228, 17,
22, 248, 96, 158, 109, 56, 9, 223, 189, 192, 0, 105, 59, 175, 117, 236, 131, 79, 15, 222, 98, 191,
205, 32, 110, 183, 247, 123, 187, 4, 221, 81, 70, 203, 172, 71, 224, 202, 233, 171, 65, 164, 220,
72, 211, 100, 116, 181, 190, 113, 179, 60, 62, 138, 213, 166, 95, 29, 144, 112, 1, 10, 94, 77, 127,
246, 197, 87, 151, 253, 18, 254, 84, 207, 39, 162, 240, 16, 67, 217, 53, 229, 93, 157, 128, 239, 40,
243, 102, 42, 85, 37, 251, 57, 103, 107, 174, 118, 242, 252, 160, 14, 200, 33, 198, 6, 7, 159, 89,
184, 216, 177, 148, 165, 132, 3, 227, 50, 237, 104, 5, 108, 188, 63, 2, 153, 124, 210, 147, 76,
51, 185, 136, 119, 120, 23, 36, 47, 250, 141, 154, 41, 225, 97, 143, 73, 48, 11, 150, 135, 176, 78, 30, 52, 28, 232, 168, 199,
27, 43, 133, 231, 19, 245, 126, 24, 68);

var
zakod: string;
Form1: TForm1;
count,nol: integer;
Gama:array[1..256] of byte;
implementation

{$R *.dfm}

// Зашифровка,отображение исходного текста и зашифрованного************
procedure TForm1.LMDButton1Click(Sender: TObject); //
var st, temp: string; i,q, ch, nch, nb, ns: integer; f:system.text;
kluch: array of byte; // Для хранения ключа
arrtemp: array[1..10] of char; // Массив для временного хранения элементов блока
begin
zakod:="";
if (MaskEdit1.Text="") or (MaskEdit2.Text="") then // Проверка, введены ли ключи
begin
ShowMessage ("Введите оба ключа");
MaskEdit1.SetFocus;
Exit;
end;
if opendialog1.Execute then //Открытие файла для зашифровки
LMDMemo1.Lines.LoadFromFile(OpenDialog1.FileName);
st:=MaskEdit1.Text;
count:=Length(st);
ch:=0;
nch:=0;
SetLength(kluch, count);
for i:=1 to count do
begin
kluch[i-1]:=Ettalon[ord(st[i])]; // Вычисление чисел, для изменения таблицы символов
if kluch[i-1] mod 2=0 then ch:=ch+kluch[i-1] else nch:=nch+kluch[i-1];
end;
temp:=floattostr((ch/2.71)-int(ch/2.71));
if temp="0" then temp:="2186";
ch:=strtoint(temp[3]+temp[4]);
temp:=floattostr((nch/2.71)-int(nch/2.71));
if temp="0" then temp:="2121";
nch:=strtoint(temp[3]+temp[4]);
for i:=1 to 256 do // Создание гаммы наложения
begin
if i mod 3=0 then
begin
if i mod 2=0 then
begin
q:=abs(Ettalon[i]-nch);
q:=q mod 256;
Gama[i]:=q;
end
else Gama[i]:=(abs(Ettalon[i]-ch)mod 256);
end
else
if i mod 2=0 then Gama[i]:=(abs(Ettalon[i]+ch)mod 256)
else Gama[i]:=(abs(Ettalon[i]+nch)mod 256);
end;
temp:=LMDMemo1.Text; //Копируем файл в текстовую переменную
nb:=0;
ns:=1;
q:=10-(length(temp) mod 10);//Считаем недостающие до 10 символы
for i:=1 to q do temp[length(temp)+1]:=MaskEdit2.Text[i]; // Добавление недостающих символо блока из подтверждающего ключа
for i:=1 to length(temp) do // Алгоритм шифрования
begin
if ns=11 then //Считает символы для подсчёта и перехода в следующий блок
begin
nb:=nb+1; // Подсчёт блоков
ns:=1;
end;
begin
if nb mod 2=0 then //Для чётных блоков
begin
q:=(ord(temp[i])+Gama[i mod 256]);
q:=q mod 256;
arrtemp[(11-ns)]:=chr(q);
end
else
begin
zakod:=zakod+(chr((ord(temp[i])+Gama[i mod 256]) mod 256)); //Для нечётных блоков
end;
end;
ns:=ns+1;
if (i mod 10=0) and (nb mod 2=0) then //Сохранение перевёрнутого блока
for q:=10 downto 1 do zakod:=zakod+arrtemp[q];
end;
assignfile(f,"m:\proba");
rewrite(f);
Edit1.Text:=inttostr(length(zakod));
for i:=1 to length(zakod) do
write(f,zakod[i]);
closefile(f);
LMDMemo2.Text:=zakod;


 
Serginio   (2003-06-02 18:07) [17]

function GetTextStr(List:TStrings): string;
var
I, L, Size, Count: Integer;
P: PChar;
S, LB: string;
begin
Count :=List.Count;
Size := 0;
LB := #10 //sLineBreak;
for I := 0 to Count - 1 do Inc(Size, Length(list[I]) + Length(LB));
SetString(Result, nil, Size);
P := Pointer(Result);
for I := 0 to Count - 1 do
begin
S := List[I];
L := Length(S);
if L <> 0 then
begin
System.Move(Pointer(S)^, P^, L);
Inc(P, L);
end;
L := Length(LB);
if L <> 0 then
begin
System.Move(Pointer(LB)^, P^, L);
Inc(P, L);
end;
end;
end;


 
borg   (2003-06-02 18:52) [18]

>>Serginio
Если честно не понятно, как пользоваться этой функцией, в конце работы алгоритма получается закодированный текст в стринговой переменной и при сохранении его в файл возникают выше описанные проблемы.


 
Cobalt   (2003-06-02 19:10) [19]

Будешь записывать в текстовый файл (system.text) - будут ошибки. Используй другой тип файла.


 
Serginio   (2003-06-02 19:13) [20]

Используй TFileStream. Кодируй в буффер и записывай его а затем загружай в буффер и декодируй.


 
borg   (2003-06-02 19:24) [21]

>>Serginio
Спасибо, попробуем!


 
Poirot (Work)   (2003-06-02 20:24) [22]

Госпада! А вам не кажется, что подход автора принциписально не верен и некоторые решения избыточны, на столько, на сколько это возможно! С позволения, могу предложить автору пересмотреть свой вопрос и бить людей рямо влоб - "Как считать из файла инфу, кодировать/декодировать и записать её прямо в файл"!
TStream юзать - аля ООП, но скорость работы заметно ниже, чем просто использовать File.


 
borg   (2003-06-03 10:10) [23]

>>Poirot (Work)
Да конечно можно шифровать е менее изощрёнными пособами гораздо эффиктивнеей работающими слава богу их в инете можно посмотреть в избытке, но проблема в том что это для диплома тема "средства криптозащиты информации", и в программе желательно рассмотреть все виды криптографии и наложение и деление на блоки и просто сдвигсимволов. Вот поэтому и получается такой алгоритм.
А что касается потоков то я с ними ни разу не работал, но сейчас буду разбиратся. Если кто может чем нибудь помочь то с удовольствием почитаю, особенно как работать с потокамию



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

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

Наверх




Память: 0.52 MB
Время: 0.006 c
1-50395
Тфьу
2003-06-04 13:05
2003.06.16
Отрисовка линии Canvas в


14-50518
dimodim
2003-05-27 07:08
2003.06.16
КАк написать CGI на дельфи для записи в базу данный?Есть ли исход


1-50371
Timak
2003-06-04 08:58
2003.06.16
Помогите узнать время создания файла


14-50486
Music
2003-05-29 01:38
2003.06.16
Music


1-50387
Rel_
2003-06-04 09:24
2003.06.16
Чтение из файла





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский