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

Вниз

Проблема с заполнением массива байтов.   Найти похожие ветки 

 
Gear   (2005-05-20 17:45) [0]

Шифрую строку 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     ".По идее это одно и тоже. Кто подскажет где у меня не так заполняется массив байт? (функции и всяк лабуду отвечающую за шифровку дешифровку убрал чтобы не смущать).


 
Gear   (2005-05-20 17:47) [1]

да забыл:
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;


 
begin...end ©   (2005-05-20 19:56) [2]

> 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.


 
begin...end ©   (2005-05-20 20:03) [3]

Нет, не так. Сорри. В строке ведь 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))


 
Gear   (2005-05-20 23:07) [4]

о спасибо большое! всё работает!


 
Gear   (2005-05-20 23:10) [5]

работает кстати последний пример только почему-то :)


 
begin...end ©   (2005-05-21 08:42) [6]

> Gear   (20.05.05 23:10) [5]

> работает кстати последний пример только почему-то

Все примеры из поста [3] должны работать одинаково и давать на выходе закоментированный в [0] массив.


 
TOT   (2005-05-27 13:10) [7]

Спасибо!!! После небольших изменений в НехТоинт всё заработало как надо!!!!


 
begin...end ©   (2005-05-27 18:51) [8]

> TOT   (27.05.05 13:10) [7]

HexToInt вполне можно заменить стандартной функцией StrToInt, о чём я и написал ещё в [2].



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

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

Наверх




Память: 0.49 MB
Время: 0.114 c
1-1117278587
syama
2005-05-28 15:09
2005.06.14
как зделать align manually?


1-1117440196
Kolan
2005-05-30 12:03
2005.06.14
Где функция RealizeLength в D7 или её аналог.


14-1117023904
cyborg
2005-05-25 16:25
2005.06.14
Сейчас новости шестичасовые по первому были


1-1117444953
54321
2005-05-30 13:22
2005.06.14
Поверх всех окон


6-1111582563
hexen
2005-03-23 15:56
2005.06.14
Как получить HTML-код страницы