![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с заполнением массива байтов. [D7, WinXP]
Gear © (2005-05-20 17:45:00)Шифрую строку 123 и получаю hex-строку и вывожу её в мемо
-----------------------------
шифрование:
в едит пишем '123'
var
s: Pchar;
str:string;
i: integer;
dta: array of byte;
m:integer;
begin
str:=Edit1.Text;
m:=length(str) mod 8;
if m<>0 then
begin
for j:=1 to 8-m do
begin
str:=str+' ';
end;
end;
s:=Pchar(str);
dta:=nil;
SetLength(dta, length(s));
for i:=1 to (length(s) div 8) do
begin
// функция шифрования
end;
for i:=0 to length(s)-1 do
memo1.Text:=memo1.Text+IntToHex(dta[i],2);
на выходе получаем в мемо строчку 'FFE7F0ECDC6B93E3'
-------------
теперь самое страшное -дешифровка:
var
s: Pchar;
str:Pchar;
i,j: integer;
KeyData: TGOSTData;
dta1: array of byte;
dta2: array of byte;
m:integer;
sst:string;
hexstring:string;
begin
str:=pchar(memo1.Text);
dta1:=nil;
dta2:=nil;
SetLength(dta1, 8);
for i:=1 to 8 do begin
if (i mod 2)=0 then begin end else
begin
dta1[i-1]:=hextoint(str[i-1]+str[i]);
end;
end;
{
SetLength(dta1, 8);
//SetLength(dta2, 8);
dta1[0]:=255;
dta1[1]:=231;
dta1[2]:=240;
dta1[3]:=236;
dta1[4]:=220;
dta1[5]:=107;
dta1[6]:=147;
dta1[7]:=227;
}
for i:=1 to (length(dta1) div 8) do
begin
SetLength(dta2, length(dta2)+8);
//дешифруем
end;
for i:=0 to length(dta2)-1 do
memo2.Text:=memo2.Text+chr(dta2[i]);
и не работает (в мемо сыпет всякую хрень а не '123 '), но что самое удивительное если раскомментить, то что в {} и убрать блок чуть выше, то работает и выдаёт в мемо '123 '.По идее это одно и тоже. Кто подскажет где у меня не так заполняется массив байт? (функции и всяк лабуду отвечающую за шифровку дешифровку убрал чтобы не смущать).
begin...end (2005-05-27 18:51:00) [1]> TOT (27.05.05 13:10) [7]
HexToInt вполне можно заменить стандартной функцией StrToInt, о чём я и написал ещё в [2].
TOT (2005-05-27 13:10:00) [2]Спасибо!!! После небольших изменений в НехТоинт всё заработало как надо!!!!
begin...end (2005-05-21 08:42:00) [3]> Gear (20.05.05 23:10) [5]
> работает кстати последний пример только почему-то
Все примеры из поста [3] должны работать одинаково и давать на выходе закоментированный в [0] массив.
Gear (2005-05-20 23:10:00) [4]работает кстати последний пример только почему-то :)
Gear (2005-05-20 23:07:00) [5]о спасибо большое! всё работает!
begin...end (2005-05-20 20:03:00) [6]Нет, не так. Сорри. В строке ведь 16 символов, а цикл только по первым восьми.
for i := 1 to 16 do
if (i mod 2) = 0 then
dta[(i div 2) - 1] := HexToInt(str[i - 1] + str[i])
Кстати, есть ещё функция Odd.
Но я обычно делаю примерно так:
for i := 1 to 16 div 2 do
dta[i - 1] := HexToInt(str[2 * i - 1] + str[2 * i])
или так:
for i := 1 to 16 div 2 do
dta[i - 1] := HexToInt(Copy(str, 2 * i - 1, 2))
begin...end (2005-05-20 19:56:00) [7]> Gear (20.05.05 17:45)
>for i:=1 to 8 do begin
> if (i mod 2)=0 then begin end else
> begin
> dta1[i-1]:=hextoint(str[i-1]+str[i]);
> end;
> end;
for i := 1 to 8 do
if (i mod 2) = 0 then
dta[i - 1] := HexToInt(str[i - 1] + str[i])
> Gear (20.05.05 17:47) [1]
См. в справке описание функции StrToInt.
Gear (2005-05-20 17:47:00) [8]да забыл:
function HexToInt(s: string): Longword;
var
b: Byte;
c: Char;
begin
Result := 0;
s := UpperCase(s);
for b := 1 to Length(s) do
begin
Result := Result * 16;
c := s[b];
case c of
'0'..'9': Inc(Result, Ord(c) - Ord('0'));
'A'..'F': Inc(Result, Ord(c) - Ord('A') + 10);
else
raise EConvertError.Create('No Hex-Number');
end;
end;
end;