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

Вниз

Перевод   Найти похожие ветки 

 
Лана Розанова ©   (2003-07-10 10:43) [0]

Помогите перевести код с С++ на Pascal. СПАСИБО!!!


unsigned getKS(unsigned char *uk, int kol)
{
unsigned crc;
int i,k;

crc=0xFFFF;

for(i=0; i<kol; i++) {
crc ^= *uk++ ;
for(k=0; k<8; k++) {
if(crc & 1) { crc >>=1; crc ^=0xA001; }
else crc >>=1;
}
}
return crc;
}


 
Лана Розанова ©   (2003-07-10 12:03) [1]

Помогите пожалуйста, надо сильно.


 
KSergey ©   (2003-07-10 12:12) [2]

Надеюсь, что unsigned = unsigned int (что-то не попалось сейчас в документации)
Не проверял функцуионально, но компилируется(формально переведено):

function getKS(uk: PChar; kol: Integer): Cardinal;
var
crc: Cardinal;
i,k: Integer;
begin

crc := $FFFF;

for i := 0 to kol-1 do
begin
crc := crc OR Integer(uk[0]);
Inc (uk);
for k := 0 to 7 {8-1} do
begin
if Boolean(crc AND 1) then // сюда дает предупреждение и signed и not signed; может 1 заменить типизированной константой?
begin
crc := crc SHR 1;
crc := crc OR $A001;
end
else
crc := crc SHR 1;
end;
end;
Result := crc; // вообще говоря можно сразу вместо crc использовать везде Result
end;



 
Axis_of_Evil ©   (2003-07-10 12:23) [3]

>вообще говоря можно сразу вместо crc использовать везде Result
Помнится в С++ при Resultании происходит выход из функции


 
SVM (Perm)   (2003-07-10 12:24) [4]

Ну вроде так (пусть другие поправят, если что неверно):

function getKS(uk:PByte; kol:Integer):Cardinal;
var
i,k: Integer;
begin
Result:=$FFFF;
for I:=0 to kol-1 do
begin
Result=Result xor uk^;
Inc(uk);
for K:=0 to 7 do
begin
if (Result and 1)<>0 then Result:=(Result shr 1) xor $A001
else Result:=Result shr 1;
end;
end;

end;


 
Лана Розанова ©   (2003-07-10 12:25) [5]

А как теперь это число разделить на 2 байта? Старший и младший.


 
SVM (Perm)   (2003-07-10 12:28) [6]

А результат-то двух или четырех байтовый?

В любом случае
LoByte:=Byte(Result);
HiByte:=Byte(Result shr 8);


 
KSergey ©   (2003-07-10 12:36) [7]

Axis_of_Evil © (10.07.03 12:23)
>вообще говоря можно сразу вместо crc использовать везде Result
Помнится в С++ при Resultании происходит выход из функции


А разве в C++ есть Result? ;)

Имелся в виду, конечно же, вариант кода на паскале.


 
icWasya ©   (2003-07-10 12:42) [8]

>А результат-то двух или четырех байтовый?
судя по алгоритму в Result пишется только в два младние байта,
поэтому можно смело заменить Cardinal на Word


 
Лана Розанова ©   (2003-07-10 12:53) [9]

А вот к примеру есть массив

var
Telegram:array[1..8]of byte=($FE,$B0,1,50,0,2,0,0);

Как для него расчитать, если первые шесть байт информационных, а последние два, байты контрольной суммы.
СПАСИБО!!!


 
Skier ©   (2003-07-10 12:56) [10]

>Лана Розанова © (10.07.03 12:53)

> Как для него расчитать,

Что рассчитать ?


 
Лана Розанова ©   (2003-07-10 12:58) [11]

Контрольную сумму 6-и байт массива.


 
Вася Пупкин ©   (2003-07-10 13:06) [12]

Мдя.... нахальство - второе счастье....


 
Axis_of_Evil ©   (2003-07-10 13:06) [13]

>А разве в C++ есть Result? ;)
Ну ... return ... ошибся я


 
Skier ©   (2003-07-10 13:07) [14]

>Лана Розанова © (10.07.03 12:58)
Использовать function getKS.
Я так понимаю getKS переводится как "получить контрольную сумму" :) Нет ?



 
Лана Розанова ©   (2003-07-10 13:12) [15]

Как в значение uk подставить массив?!


 
wl ©   (2003-07-10 13:24) [16]

>Как в значение uk подставить массив?!

в качестве первого параметра использовать не PChar, Array of char


 
Skier ©   (2003-07-10 13:27) [17]

-var Telegram:array[0..7]of byte=($FE,$B0,1,50,0,2,0,0);
-function getKS(uk: PByteArray;...
-function(@Telegram...)


 
Лана Розанова ©   (2003-07-10 13:31) [18]

Вот что у меня получается

function TForm1.getKS(uk:PByteArray):Word;
var
i,k: Integer;
begin
Result:=$FFFF;
for I:=0 to 5 do
begin
Result:=Result xor ^uk; // Тут ошибка...
inc(uk);
for K:=0 to 7 do
begin
if (Result and 1)<>0 then Result:=(Result shr 1) xor $A001
else Result:=Result shr 1;
end;
end;

end;

procedure TForm1.FormActivate(Sender: TObject);
begin
getKS(@Telegram);
end;


 
Skier ©   (2003-07-10 13:36) [19]

Result:=Result xor uk^[I]; ?


 
Skier ©   (2003-07-10 13:37) [20]

inc(uk); - убери


 
Лана Розанова ©   (2003-07-10 13:38) [21]

А как использовать это

LoByte:=Byte(Result);
HiByte:=Byte(Result shr 8);


 
Skier ©   (2003-07-10 13:40) [22]

>Лана Розанова © (10.07.03 13:38)
Ой, поясни !


 
sniknik ©   (2003-07-10 13:44) [23]

чемто смутно напоминает....
http://delphimaster.net/view/1-1057742257/
>а как получить рез-т в виде pointer и size ( кол-во значащих бит)?


 
Лана Розанова ©   (2003-07-10 13:52) [24]

Теперь этот результат надо разбить на 2 байта.


 
Skier ©   (2003-07-10 13:58) [25]

>Лана Розанова © (10.07.03 13:52)
LoByte := Lo(Result);
HiByte := Hi(Result);
Пока (или всё ещё) не вижу проблемы...



 
MBo ©   (2003-07-10 14:01) [26]

>Skier
>Пока (или всё ещё) не вижу проблемы...

Зеленый ты еще ;))


 
Palladin ©   (2003-07-10 14:01) [27]


> Лана Розанова © (10.07.03 13:52)

Вы, извините, помоему не по специальности работаете, или Вы все таки учитесь еще, а может вы учитель информатики?


 
Лана Розанова ©   (2003-07-10 14:03) [28]

Я написала так:

function TForm1.getKS(uk:PByteArray):Word;
var
i,k: Integer;
begin
Result:=$FFFF;
for I:=0 to 5 do
begin
Result:=Result xor uk^[i];
for K:=0 to 7 do
begin
if (Result and 1)<>0 then Result:=(Result shr 1) xor $A001
else Result:=Result shr 1;
end;

Telegram[7]:=Lo(Result);
Telegram[6]:=Hi(Result);
end;

end;


Ответ должен быть 117 и 237


 
Skier ©   (2003-07-10 14:04) [29]

type
TTwoBytesForLana = record
HiByte : Byte;
LoByte : Byte;
end; //TTwoBytesForLana

function getKS(uk:PByteArray) : TTwoBytesForLana;
var
i,k: Integer;
AResult : Word;
begin
FillChar(Result, SizeOf(TTwoBytesForLana), 0);
AResult:=$FFFF;
for I:=0 to 5 do
begin
AResult:=AResult xor uk^[i];
for K:=0 to 7 do
begin
if (AResult and 1)<>0 then AResult:=(AResult shr 1) xor $A001
else AResult:=AResult shr 1;
end;
with Result do begin
HiByte := Hi(AResult);
LoByte := Lo(AResult);
end; //with
end;
end;


 
Вася Пупкин ©   (2003-07-10 14:04) [30]

> MBo © (10.07.03 14:01)
-)))


 
Skier ©   (2003-07-10 14:05) [31]

>MBo © (10.07.03 14:01)
>Вася Пупкин © (10.07.03 14:04)
Злые Вы ! :))


 
MBo ©   (2003-07-10 14:10) [32]

>Skier
Не злые, а опыт имеем ;)


 
Skier ©   (2003-07-10 14:11) [33]

>MBo © (10.07.03 14:10)
В какой-такой области ? :)


 
Digitman ©   (2003-07-10 14:13) [34]


> Лана Розанова


Да ты издеваешься что ли, барышня ?) Я ж тебе уже разжевывал всю эту твою "кухню" ! И про GetKS(), и про передачу массива-параметра ! И - все по новой ?) Лыко-мочало ?)


 
wl ©   (2003-07-10 14:14) [35]

> Лана Розанова ©
Попробуй так, раньше в коде были ошибки

var
Telegram:array[0..7]of byte=($FE,$B0,1,50,0,2,0,0);

function TForm1.getKS(uk:PByteArray):Word;
var
i,k: Integer;
begin
Result:=$FFFF;
for I:=0 to 5 do
begin
Result:=Result xor word(uk[I]); //


 
Лана Розанова ©   (2003-07-10 14:14) [36]

>Skier
СпасибоЧки!!! Все получилось.


 
Skier ©   (2003-07-10 14:15) [37]

>Лана Розанова © (10.07.03 14:14)
Ай, молодца ! :)


 
Лана Розанова ©   (2003-07-10 14:16) [38]

>Digitman
Я диск случайно отформатировала, а ка делать снова забыла. Пришлось так вспоминать. Кстати, где привет?


 
LordOfSilence ©   (2003-07-10 14:29) [39]

Пишу тупо в Блокноте, поэтому могу напортачить:

Function getKS( uk : Pchar, kol : integer ) : LongWord;
var
crc : LongWord;
i, k : integer;
begin
crc := $FFFF;
for i := 0 to kol - 1 do begin
crc := crc xor byte( uk[i] );
for k := 0 to 7 do
if crc and 1 <> 0 then begin
crc := crc shr 1;
crc := crc xor $A001;
end
else crc := crc shr 1;
end;
Result := crc;
end;


 
Digitman ©   (2003-07-10 14:33) [40]


> Лана Розанова


)... привет, привет !)



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

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

Наверх




Память: 0.56 MB
Время: 0.015 c
3-91625
Step[B.M.]
2003-06-28 09:29
2003.07.28
Хранимая процедура для InterBase. Help.


6-91791
Leran2002
2003-05-22 13:55
2003.07.28
SSH и SFTP


14-91841
Night_Devil
2003-07-09 05:47
2003.07.28
Как можно передать скрипту на сайте POST значения....


3-91622
Step[B.M.]
2003-07-04 08:57
2003.07.28
Триггер InterBase


3-91644
Карелин Артем
2003-07-04 08:55
2003.07.28
Цикл в ХП.