Ошибка xor

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

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

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

Ошибка xor

Сообщение DarkSmile »

Здравствуйте! Объясните пожалуйста что-за дела, поставил недавно 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;   
Putnick
новенький
Сообщения: 62
Зарегистрирован: 18.03.2009 12:02:56

Сообщение Putnick »

А он в старом-то Лазаре компилился? Тип PByteArray вроде как указатель...
Думаю вот так будет работать:

Код: Выделить всё

m^[i]:=(m^[i] xor k)
Аватара пользователя
DarkSmile
новенький
Сообщения: 18
Зарегистрирован: 09.06.2013 14:52:56
Контактная информация:

Сообщение DarkSmile »

Да в старом компилировался. Спасибо, так работает)
Putnick
новенький
Сообщения: 62
Зарегистрирован: 18.03.2009 12:02:56

Сообщение Putnick »

Был рад помочь! :D
Да, с Новым Годом!!!
Аватара пользователя
pi1
новенький
Сообщения: 59
Зарегистрирован: 19.04.2012 18:11:24
Откуда: г.Зеленокумск
Контактная информация:

Сообщение pi1 »

Столкнулся с интересной фичей, ниже приведенная функция дала разный результ на двух разных компах под 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;
MiniQ
новенький
Сообщения: 81
Зарегистрирован: 28.01.2013 16:31:55

Сообщение MiniQ »

Странное приведение типов
Char(Byte(Str[j])
vs
Byte(aKey[i]))
, я бы все привел к одному типу.
Потом, надо помнить, что string может быть в кодировке UTF8, по этому лучше использовать ansistring.
Аватара пользователя
pi1
новенький
Сообщения: 59
Зарегистрирован: 19.04.2012 18:11:24
Откуда: г.Зеленокумск
Контактная информация:

Сообщение pi1 »

Проверил, разница машин только в проце . Один Intel другой AMD. На обеих машинах WIN7-32. Наверное нужно привести string к конкретному типу. Спасибо за подсказку с типами. Проверю- отпишусь.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

Еще имеет смысл вместо приведения типов (Char() и Byte()) использовать соответственно Chr() и Ord().
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение bormant »

Mirage,
поясните, в чем смысл вместо приведения типов использовать функции?
Правда, следует признать, что конкретно в этом случае результат должен получится не хуже (такие уж это функции в силу магии компилятора).
Аватара пользователя
pi1
новенький
Сообщения: 59
Зарегистрирован: 19.04.2012 18:11:24
Откуда: г.Зеленокумск
Контактная информация:

Сообщение pi1 »

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


После приведения всех переменных, задействованных в процессе (там не только приведенная функция) проблема отпала. На всех машинах один результ. Мораль- нужно избавиться от рудимента в своей логике при работе с типом string и использовать конкретно ansisttring или utf8string.
MiniQ
новенький
Сообщения: 81
Зарегистрирован: 28.01.2013 16:31:55

Сообщение MiniQ »

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

Очень пафосно. Посмеялся.
Сама логика шифрования XORом по строке с переменным размером символа - ущербна. После шифрования это уже небудет являться строкой в общем случае.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

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


Смысл в том, что результат либо тот же (как вероятно в данном случае), либо лучше. Напрмер, Byte(boolean) может на выходе что угодно от 0 до 255 дать. Ord() выдаст либо 0, либо 1. Натыкался при портировании кода с Delphi.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

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

Совершенно верно. Я сам сталкивался с подобным шифрованием при модернизации одной чужой программы. Самое правильное ИМХО - переводить строку в массив байтов, шифровать/расшифровывать и потом только конвертировать обратно в строку.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

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

Сообщение MiniQ »

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

Не останется. Операция не обратима при работе с UTF8 символами. После шифрования по индексу будет выдана часть символа.
Ответить