C -> Pas

Модератор: Модераторы разделов

m-i-b
Сообщения: 2
ОС: Debian sid

C -> Pas

Сообщение m-i-b »

Пишу в основном на С, но тут срочно понадобился код на паскале :dry: .
Вот исходный, написанный на С :

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

int CRCode (char *msg, int len)
{
int crc,j;
crc = 0;
while ( len-- > 0 )
{
crc = crc ^ (int) *msg++ << 8;
for ( j=0; j < 8; j++ )
{
if(crc & 0x8000) crc = (crc << 1) ^ 0x1021;
else crc <<= 1;
}
}
return crc;
}


Помогите, кто может, переделать это дело на паскаль. Буду очень благодарен.
Спасибо сказали:
Аватара пользователя
_Storm
Сообщения: 135
ОС: MOPS Linux 5.0

Re: C -> Pas

Сообщение _Storm »

int CRCode (char *msg, int len)
{
int crc,j;
crc = 0;
while ( len-- > 0 )
{
crc = crc ^ (int) *msg++ << 8;
for ( j=0; j < 8; j++ )
{
if(crc & 0x8000) crc = (crc << 1) ^ 0x1021;
else crc <<= 1;
}
}
return crc;
}


Паскаль конечно помню очень смутно...

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

function CRCode (msg:string, len:integer):integer
Begin
 crc,j: Integer;
 crc := 0;
 while len-1 > 0 do
 Begin
     crc = crc ^ (int) *msg++ << 8; //вот с этим я затрудняюсь придумать что сделать..., наверно надо делать вставку на асме
     for j:=0 to 7 do
     begin
         if (crc AND $8000)<>0 then crc:= shl(crc,1)^$1021
         else crc := shl (crc,1);
     end
 End
 CRCode := crc;
End
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: C -> Pas

Сообщение _Gleb_ »

_Storm писал(а):
30.03.2007 21:40

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

crc = crc ^ (int) *msg++ << 8; //вот с этим я затрудняюсь придумать что сделать..., наверно надо делать вставку на асме

Переведите: что требуется от этой строчки?

Увеличение / уменьшение в TurboPascal на 1 (только для целых чисел) - это inc(n) / dec(n), возведение в степень вообще реализуется через цикл или ln, переменные описываются после слова var. Как с другими диалектами - не знаю.
Изображение
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: C -> Pas

Сообщение Uncle_Theodore »

_Gleb_ писал(а):
30.03.2007 21:46
_Storm писал(а):
30.03.2007 21:40

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

crc = crc ^ (int) *msg++ << 8; //вот с этим я затрудняюсь придумать что сделать..., наверно надо делать вставку на асме

Переведите: что требуется от этой строчки?

Увеличение / уменьшение в TurboPascal на 1 (только для целых чисел) - это inc(n) / dec(n), возведение в степень вообще реализуется через цикл или ln, переменные описываются после слова var. Как с другими диалектами - не знаю.


^ -- это побитовое XOR.
<< -- это битовый сдвиг.

<< 8 вообще-то эквивалентно умножению на два в восьмой степени.
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: C -> Pas

Сообщение _Gleb_ »

Ну а делает оно что? И какой диалект языка? TP пойдёт?
Изображение
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: C -> Pas

Сообщение Alxn1 »

Внесу и я свою скромную лепту. Примерно так должно получиться:

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

function CRCode( msg:String ):Integer
var
    len, crc, j, i:Integer;
begin
    len := length( msg );
    crc := 0;
    i := 1;
    while( i <= len )
    begin
        crc := crc xor ( Integer( ord( msg[i] ) ) shl 8 ); { Вот тут мог напутать. Не уверен, что в паскале так можно типы приводить. Да и про эти xor, and и прочее не уверен. Давно на паскале не писал :) }
        for j := 0 to 7 do
        begin
            if( ( crc and 8000h ) <> 0 ) then
                crc = ( crc shl 1 ) xor 0x1021
            else
                crc = crc shl 1;
        end;
        inc( i );
    end;
    return crc;
end;
Спасибо сказали:
m-i-b
Сообщения: 2
ОС: Debian sid

Re: C -> Pas

Сообщение m-i-b »

Alxn1 писал(а):
30.03.2007 22:47
Внесу и я свою скромную лепту. Примерно так должно получиться:
Спасибо. Чуть чуть подправил... и заработало ! :blush:

Есть ещё маленькая просьба... Теперь надо вот этот код переделать... и снова на пас... :dry:

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

unsigned crc;
unsigned char Error Check l, Error Check h, Data[BytesCount];

WORD Crc16(BYTE *Data, ULONG size)
{
    union {BYTE b[2]; unsigned short w;} Sum;
    char shift_cnt;
    BYTE *ptrByte; ULONG  byte_cnt = size;

    ptrByte=Data;
    Sum.w=0xffffU;
    for(; byte_cnt>0; byte_cnt--)
        {
Sum.w=(unsigned
short)((Sum.w/256U)*256U+((Sum.w%256U)^(*ptrByte++)));
        for(shift_cnt=0; shift_cnt<8; shift_cnt++)
            {
            if((Sum.w&0x1)==1)
                Sum.w=(unsigned short)((Sum.w>>1)^0xa001U);
            else
                Sum.w>>=1;
            }
       }
return Sum.w;
}
Спасибо сказали: