Форум: "Начинающим";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];
ВнизЦелый тип 8 байт Найти похожие ветки
← →
Влад (2007-01-02 16:53) [0]Как создать целый тип диапазоном от 0 до 2^64-1 (на 8 байт)?
Будут ли с ним корректно работать операции xor, shl, shr, mod, div, +- и т.д.?
← →
Джо © (2007-01-02 16:58) [1]64-битный тип в Делфи уже есть — Int64.
> Будут ли с ним корректно работать операции xor, shl, shr,
> mod, div, +- и т.д.?
Да.
← →
Джо © (2007-01-02 17:00) [2]Впрочем, он signed, т.е., –2^63..2^63–1.
← →
Влад (2007-01-02 17:12) [3]
> 64-битный тип в Делфи уже есть — Int64.
Во-первых, он может быть отрицательным, а во-вторых - максимальное положительное число в нем 2^63-1, этого мало.
← →
Sha © (2007-01-02 20:34) [4]Насколько помню, сдвиги для int64 реализованы даже лучше :)
например
int64 shr 64 = 0 (все ушло вправо за границу числа)
integer shr 32 = integer (число не изменилось)
← →
Влад (2007-01-02 20:51) [5]а например такой кусочек кода?
a1,a2,q[i] - 16, 32 или 64 бита, только положительные и 0.
b2- 2 в степени 16, 32 или 64 соответственно.
a1:=(a1+q[0])mod b2;
a2:=(a2+q[1])mod b2;
for i:=1 to r do begin
a1:=(((a1 xor a2)shl a2)+q[2*i])mod b2;
a2:=(((a2 xor a1)shl a1)+q[2*i+1])mod b2;
end;
← →
Влад (2007-01-02 20:53) [6]если брать a1,a2,q[i] как int64 для 32 бит, то при ЛЮБЫХ a1,a2 выводится один и тот же результат.
← →
Sha © (2007-01-02 21:15) [7]где выводится?
← →
Влад (2007-01-02 21:38) [8]через watches смотрю.
← →
Sha © (2007-01-02 21:46) [9]А у меня при a1:=1; a2:=2; и при a1:=2; a2:=1; результат разный.
В чем проблема-то?procedure TForm1.Button10Click(Sender: TObject);
var
q: array[0..1] of int64;
a1, a2, b2: int64;
i, r: integer;
begin
a1:=1; a2:=2;
q[0]:=0; q[1]:=0;
b2:=32;
r:=0;
a1:=(a1+q[0])mod b2;
a2:=(a2+q[1])mod b2;
for i:=1 to r do begin
a1:=(((a1 xor a2)shl a2)+q[2*i])mod b2;
a2:=(((a2 xor a1)shl a1)+q[2*i+1])mod b2;
end;
ShowMessage(Format("%d %d",[a1,a2]));
end;
← →
Влад (2007-01-02 21:56) [10]Ну для начала r возьми не нулем. (у меня 20).
Соответственно количество чисел в массиве q - 42.
И попробуй в a1, a2 числа в диапазоне (2^30) - (2^32-1).
← →
Влад (2007-01-02 21:58) [11]Да, и числа в массиве q тоже не нули естественно, тоже побольше возьми.
← →
Sha © (2007-01-02 22:05) [12]Да на фига мне брать что-то.
И так ясно, что иногда результат сопадать может.
В чем проблема? В том, что числа одинаковые бывают?
← →
Влад (2007-01-02 22:19) [13]Нет, ты попробуй. В том-то и дело, что при одном и том же q, но разных a1 и a2 результат один и тот же.
← →
Sha © (2007-01-02 22:28) [14]Это ты попробуй сформулировать свою проблему.
Например, так: знаю, что должно быть то-то, получаю то-то.
А так неясно, чего ты добиваешься.
Похоже, что код не твой, и ты не знаешь зачем он нужен :))
← →
Влад (2007-01-02 22:33) [15]Хорошо, раз такой упорный.
Шифр RC5 32|12|16.
Функции кнопок button1 и button2 обратны друг другу.
Поля edit1 и edit2 - по 4 символа.
При нажатии последовательно button1 и button2 поля edit1 и edit2 не должны изменится.
...
q:array[0..25]of int64;
const
b=32;
r=12;
l=16;
implementation
{$R *.dfm}
function st(x,y:integer):int64;
var rez:int64;
i:integer;
begin
rez:=1;
for i:=1 to y do rez:=rez*x;
st:=rez;
end;
function toint(s:string):int64;
var i:integer;
rez:int64;
begin
rez:=0;
for i:=length(s) downto 1 do rez:=rez+ord(s[i])*st(256,length(s)-i);
toint:=rez;
end;
function tostr(s:int64;len:byte):string;
var i:integer;
rez:string;
begin
rez:="";
for i:=len downto 1 do rez:=rez+chr((s div st(256,i-1))mod 256);
tostr:=rez;
end;
procedure TForm2.Button1Click(Sender: TObject);
var a1,a2:int64;
b2:int64;
i:integer;
begin
a1:=toint(edit1.text);
a2:=toint(edit2.text);
b2:=st(2,b);
a1:=(a1+q[0])mod b2;
a2:=(a2+q[1])mod b2;
for i:=1 to r do begin
a1:=(((a1 xor a2)shl a2)+q[2*i])mod b2;
a2:=(((a2 xor a1)shl a1)+q[2*i+1])mod b2;
end;
edit1.text:=tostr(a1,b div 8);
edit2.text:=tostr(a2,b div 8);
end;
procedure TForm2.Button2Click(Sender: TObject);
var a1,a2:lint64;
b2:int64;
i:integer;
begin
a1:=toint(edit1.text);
a2:=toint(edit2.text);
b2:=st(2,b);
for i:=r downto 1 do begin
a2:=(((a2-q[2*i+1])mod b2)shr a1)xor a1;
a1:=(((a1-q[2*i])mod b2)shr a2)xor a2;
end;
a2:=(a2-q[1])mod b2;
a1:=(a1-q[0])mod b2;
edit1.text:=tostr(a1,b div 8);
edit2.text:=tostr(a2,b div 8);
end;
procedure TForm2.FormShow(Sender: TObject);
const pw=$b7e15163;qw=$9e3779b9;
var k:array[0..3]of int64;
i,j,d:byte;
a1,a2:int64;
begin
q[0]:=pw;
k[0]:=234222;
k[1]:=234;
k[2]:=234234;
k[3]:=32423;
for i:=1 to 25 do q[i]:=q[i-1]+qw;
i:=0;j:=0;a1:=0;a2:=0;
for d:=1 to 78 do begin
q[i]:=(q[i]+a1+a2)shl 3;
a1:=q[i];
k[j]:=(k[j]+a1+a2)shl(a1+a2);
a2:=k[j];
i:=i+1;
if i=26 then i:=0;
j:=j+1;
if j=4 then j:=0;
end;
end;
← →
Sha © (2007-01-02 22:42) [16]Я ж говорил :)
В сети полно нормальных реализаций.
← →
Влад (2007-01-02 22:47) [17]А мне надо свою.
← →
Sha © (2007-01-02 22:50) [18]сначала посмотри, как люди делают:
http://www.torry.net/pages.php?id=519
← →
Влад (2007-01-02 23:04) [19]Ну посмотрел я. И так знаю, что программирую херово. Ты мне лучше б ошибки в моей программе указал.
← →
Sha © (2007-01-02 23:06) [20]Ты бы лучше вопрос мне задал.
Несложный :)
← →
Влад (2007-01-02 23:08) [21]
> Как создать целый тип диапазоном от 0 до 2^64-1 (на 8 байт)?
>
> Будут ли с ним корректно работать операции xor, shl, shr,
> mod, div, +- и т.д.?
:))
← →
Sha © (2007-01-02 23:10) [22]Уже ответили [1] и [4].
← →
Влад (2007-01-02 23:14) [23]Уже ответил [3] :)
← →
Sha © (2007-01-02 23:20) [24]Во-первых, начиная с D7, кажется, есть uint64.
Во-вторых, непонятно, для какой операции тебе не подходит int64?
← →
Влад (2007-01-02 23:28) [25]За uint64 спасибо, а нужен он будет, например, для шифра 64/12/16
← →
Sha © (2007-01-02 23:32) [26]Интересно, чем не угодил int64?
Количество битов у него то же.
← →
palva © (2007-01-02 23:54) [27]> Как создать целый тип диапазоном от 0 до 2^64-1 (на 8 байт)?
Тип не создают, тип определяют, для вашего случая нужно определить запись, например так:
type
TMyType = record
l, h: LongWord
end;
Потом реализовать функции, которые производят над этой записью арифметические операции.
> Будут ли с ним корректно работать операции xor, shl, shr, mod, div, +- и т.д.?
Естественно, не будут. Эти операции применимы к целым числам а не к записям. int64 вам тоже не подойдет.
Если будете использовать int64, тогда будут правильно работать +, -, сдвиги и логические операции. Умножение и деление будут работать неправильно.
Пример:
{$APPTYPE CONSOLE}
uses SysUtils;
var
ii: Int64;
begin
ii := $8000000000000000;
ii := ii div 2; // результат неправильный, поскольку комплиятор
// считает это число отрицательнлым.
WriteLn(IntToHex(ii, 16)); // C000000000000000
ii := ii SHR 2; // а здесь работает правильно
WriteLn(IntToHex(ii, 16)); // 3000000000000000
ReadLn
end.
Если в этом примере заменить Int64 на UInt64, то на BDS выводятся нули в обоих случаях. На D7 попробовать не могу, но там, насколько я когда-то пробовал UInt64 работает идентично Int64.
← →
palva © (2007-01-02 23:56) [28]Пропустил точку с запятой:
l, h: LongWord;
← →
Влад (2007-01-02 23:57) [29]palva, большое спасибо. Теперь хоть понял, что не работает.
← →
Sha © (2007-01-03 00:05) [30]> palva © (02.01.07 23:54) [27]
Сложение, вычитание и умножение для знаковых и беззнаковых
выполняется при помощи одних и тех же машинных команд,
а делить ему скорее всего и не надо, т.к. в алгоритмах шифрования
деление обычно не используется.
← →
Влад (2007-01-03 00:15) [31]а mod чем не деление?
← →
Sha © (2007-01-03 00:22) [32]> Влад (03.01.07 00:15) [31]
а основание у mod какое? :)
← →
palva © (2007-01-03 00:35) [33]Sha © (03.01.07 00:05) [30]
Да, точно. Умножение тоже работает.
← →
Sha © (2007-01-03 00:35) [34]Вот самая страшная тайна масонов:
i mod 8 = i and 7
← →
Sha © (2007-01-03 00:42) [35]> palva © (03.01.07 00:35) [33]
ага,
а деление не работает не только из-за расширения знакового разряда,
там и команды разные.
← →
Sha © (2007-01-03 00:52) [36]> palva ©
Кстати, ничто не мешает написать свое деление по образцу Борланда с минимальными изменениями.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.047 c