Форум: "Основная";
Текущий архив: 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