Ошибка xor

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ошибка xor

Сообщение DarkSmile » 01.01.2014 20:32:57

Здравствуйте! Объясните пожалуйста что-за дела, поставил недавно lazarus последнюю версию, открываю в нем проект который был создан на старой версии и компилятор выдает мне ошибку:
Изображение
В следующем коде:
Код: Выделить всё
var f: TMemorystream;
   m: pbytearray;
   i: integer;
   k: byte;
begin
  f:=tmemorystream.create;
  f.loadfromfile(filename);
  m:=f.Memory;

  k:=$ce;
  for i:=0 to f.size-1 do
  begin
    m[i]:=(m[i] xor k)
    inc(k);
  end; 
end;   
Аватара пользователя
DarkSmile
новенький
 
Сообщения: 18
Зарегистрирован: 09.06.2013 14:52:56

Re: Ошибка xor

Сообщение Putnick » 02.01.2014 00:36:51

А он в старом-то Лазаре компилился? Тип PByteArray вроде как указатель...
Думаю вот так будет работать:
Код: Выделить всё
m^[i]:=(m^[i] xor k)
Putnick
новенький
 
Сообщения: 62
Зарегистрирован: 18.03.2009 13:02:56

Re: Ошибка xor

Сообщение DarkSmile » 02.01.2014 00:41:07

Да в старом компилировался. Спасибо, так работает)
Аватара пользователя
DarkSmile
новенький
 
Сообщения: 18
Зарегистрирован: 09.06.2013 14:52:56

Re: Ошибка xor

Сообщение Putnick » 02.01.2014 00:47:17

Был рад помочь! :D
Да, с Новым Годом!!!
Putnick
новенький
 
Сообщения: 62
Зарегистрирован: 18.03.2009 13:02:56

Re: Ошибка xor

Сообщение pi1 » 31.03.2015 11:46:39

Столкнулся с интересной фичей, ниже приведенная функция дала разный результ на двух разных компах под win7. Подозрение, что на одном из них win64, но нет уверенности. А вдруг еще что то? Посмотрите:
function Crypt(const aStr: String; const aKey: String): String;
var
str,str1:string;
j, i: Integer;
begin
if (aKey='') or (aStr='') then
Result:=aStr
else
begin
str:=(aStr);
i:=1;
SetLength(str1,Length(Str));
for j:=1 to Length(Str) do
begin
if i>Length(aKey) then
i:=1;
str1[j]:=Char(Byte(Str[j]) xor Byte(aKey[i]));
inc(i);
end;
end;
Result:=(str1);
end;
Аватара пользователя
pi1
новенький
 
Сообщения: 59
Зарегистрирован: 19.04.2012 18:11:24
Откуда: г.Зеленокумск

Re: Ошибка xor

Сообщение MiniQ » 31.03.2015 16:06:00

Странное приведение типов
Char(Byte(Str[j])
vs
Byte(aKey[i]))
, я бы все привел к одному типу.
Потом, надо помнить, что string может быть в кодировке UTF8, по этому лучше использовать ansistring.
MiniQ
новенький
 
Сообщения: 81
Зарегистрирован: 28.01.2013 16:31:55

Re: Ошибка xor

Сообщение pi1 » 31.03.2015 16:36:23

Проверил, разница машин только в проце . Один Intel другой AMD. На обеих машинах WIN7-32. Наверное нужно привести string к конкретному типу. Спасибо за подсказку с типами. Проверю- отпишусь.
Аватара пользователя
pi1
новенький
 
Сообщения: 59
Зарегистрирован: 19.04.2012 18:11:24
Откуда: г.Зеленокумск

Re: Ошибка xor

Сообщение Mirage » 02.04.2015 01:53:28

Еще имеет смысл вместо приведения типов (Char() и Byte()) использовать соответственно Chr() и Ord().
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Ошибка xor

Сообщение bormant » 02.04.2015 09:36:37

Mirage,
поясните, в чем смысл вместо приведения типов использовать функции?
Правда, следует признать, что конкретно в этом случае результат должен получится не хуже (такие уж это функции в силу магии компилятора).
Аватара пользователя
bormant
постоялец
 
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Re: Ошибка xor

Сообщение pi1 » 02.04.2015 10:54:55

MiniQ писал(а):по этому лучше использовать ansistring.


После приведения всех переменных, задействованных в процессе (там не только приведенная функция) проблема отпала. На всех машинах один результ. Мораль- нужно избавиться от рудимента в своей логике при работе с типом string и использовать конкретно ansisttring или utf8string.
Аватара пользователя
pi1
новенький
 
Сообщения: 59
Зарегистрирован: 19.04.2012 18:11:24
Откуда: г.Зеленокумск

Re: Ошибка xor

Сообщение MiniQ » 02.04.2015 14:31:25

pi1 писал(а):Мораль- нужно избавиться от рудимента в своей логике при работе с типом string и использовать конкретно ansisttring или utf8string

Очень пафосно. Посмеялся.
Сама логика шифрования XORом по строке с переменным размером символа - ущербна. После шифрования это уже небудет являться строкой в общем случае.
MiniQ
новенький
 
Сообщения: 81
Зарегистрирован: 28.01.2013 16:31:55

Re: Ошибка xor

Сообщение Mirage » 03.04.2015 01:02:27

bormant писал(а):Mirage,
поясните, в чем смысл вместо приведения типов использовать функции?
Правда, следует признать, что конкретно в этом случае результат должен получится не хуже (такие уж это функции в силу магии компилятора).


Смысл в том, что результат либо тот же (как вероятно в данном случае), либо лучше. Напрмер, Byte(boolean) может на выходе что угодно от 0 до 255 дать. Ord() выдаст либо 0, либо 1. Натыкался при портировании кода с Delphi.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Ошибка xor

Сообщение Снег Север » 03.04.2015 08:41:22

MiniQ писал(а):Сама логика шифрования XORом по строке с переменным размером символа - ущербна. После шифрования это уже небудет являться строкой в общем случае.

Совершенно верно. Я сам сталкивался с подобным шифрованием при модернизации одной чужой программы. Самое правильное ИМХО - переводить строку в массив байтов, шифровать/расшифровывать и потом только конвертировать обратно в строку.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

Re: Ошибка xor

Сообщение zub » 03.04.2015 08:52:32

>>После шифрования это уже небудет являться строкой в общем случае.
Она перестанет быть валидной utf8 строкой, возможно появятся нули в середине, но строкой с нормальными доступом по [индексу] вполне останется - такчто имхо ничего страшного
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Ошибка xor

Сообщение MiniQ » 03.04.2015 12:14:15

zub писал(а):но строкой с нормальными доступом по [индексу] вполне останется

Не останется. Операция не обратима при работе с UTF8 символами. После шифрования по индексу будет выдана часть символа.
MiniQ
новенький
 
Сообщения: 81
Зарегистрирован: 28.01.2013 16:31:55

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 236

Рейтинг@Mail.ru
cron