Текущий архив: 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