Pagina 1 di 1

[PASCAL] - [VB] Code translation

MessaggioInviato: mar ott 25, 2005 5:10 pm
da DilanDog
Ho un pezzo di codice in pascal che dovrei tradurre in VB, qualcuno può aiutarmi? Per me è arabo [:(!]


function crcvalue (stringtoeval : string): integer;
var
count: byte;
tempcrc: word;
begin
tempcrc:=$FFFF;
for count:=1 to length (stringtoeval) do
begin
tempcrc:=swap(tempcrc) xor ord (stringtoeval [count]);
tempcrc:=tempcrc xor (lo (tempcrc) shr 4);
tempcrc:=tempcrc xor (swap (lo (tempcrc)) shl 4) xor (lo (tempcrc) shl 5)
end;
crcvalue:=tempcrc xor $FFFF
end; [of function crcvalue]

MessaggioInviato: mer ott 26, 2005 9:03 am
da DilanDog
Riguardando con più calma il codice in pascal sono riuscito a capire quasi tutto. Le uniche righe che restano oscure sono quelle contenute all'interno del ciclo, ovvero:

tempcrc:=swap(tempcrc) xor ord (stringtoeval [count]);
tempcrc:=tempcrc xor (lo (tempcrc) shr 4);
tempcrc:=tempcrc xor (swap (lo (tempcrc)) shl 4) xor (lo (tempcrc) shl 5)

Ci sono alcune funzioni di cui non conosco il significato:

SWAP = Inverte l'ordine dei byte, giusto?
LO = Restituisce il byte meno significativo della variabile passata come argomento, giustio?

ORD() = ?
SHR = ?
SHL = ?

Se qualcuno mi aiuta a capire a cosa servono queste tre funzioni direi che sono a posto [applauso]

MessaggioInviato: mer ott 26, 2005 11:29 am
da Xerex
DilanDog ha scritto:SWAP = Inverte l'ordine dei byte, giusto?
LO = Restituisce il byte meno significativo della variabile passata come argomento, giustio?

ORD() = ?
SHR = ?
SHL = ?

Se qualcuno mi aiuta a capire a cosa servono queste tre funzioni direi che sono a posto [applauso]


Dalle mie rimembranze di pascal, SWAP dovrebbe serevire ad invertire il contenuto di due variabili senza utilizzare var di appoggio.
una cosa come a=5; b=6; swap(a,b) --> a=6 b=5
anche se vista la sintassi della riga che hai postato sembra che prenda un solo parametro...

shr e shl....beh...mi sanno di shift...comunque...tutto questo per dimostrare che non ricordo nulla di pascal e che ti consiglio di cercare un manualino di pascal in rete...

il primo che ho trovato e' questo...vedi se trovi qualcosa
http://freeweb.supereva.com/programmare ... dex.html?p

MessaggioInviato: mer ott 26, 2005 5:37 pm
da Silver Black
DilanDog ha scritto:tempcrc:=swap(tempcrc) xor ord (stringtoeval [count]);
tempcrc:=tempcrc xor (lo (tempcrc) shr 4);
tempcrc:=tempcrc xor (swap (lo (tempcrc)) shl 4) xor (lo (tempcrc) shl 5)


SWAP è una funzione definita da qualche altra parte, perché almeno in Delphi non esiste.

LO restituisce il byte di ordine inferiore di un intero da 2 bytes come singolo byte.

Es.:
Codice: Seleziona tutto
 var
  i : Integer;

begin
  i := $2345;  // $2345 hex : $23 hi byte, $45 lo byte
  ShowMessage(Format('Integer = $%x', [i]));
  ShowMessage(Format('Hi byte = $%x', [Hi(i)]));
  ShowMessage(Format('Lo byte = $%x', [Lo(i)]));
end;


Restituisce:

Integer = $2345
Hi byte = $23
Lo byte = $45


Ci sono alcune funzioni di cui non conosco il significato:

ORD restituisce il valore ordinale di un integer, char o enum. L'ORD di un carattere restituisce il suo codice ascii.

SHR - SHL eseguono lo shift di bytes rispettivamente a destra e a sinistra, di un numero di bit specificato.

Spero sia tutto quello che ti serve, in caso chiedi pure!

MessaggioInviato: gio ott 27, 2005 11:54 am
da DilanDog
Vediamo se ho capito bene il funzionamento di shl e shr....

Poniamo la variabile test=0x34

34 in binario = 110100
shr 4 = 110100 = 4
shl 4 = 110100 = 4
shl 5 = 110100 = 14


Giusto? Si vede che in vb le funzioni di shift non ci sono... [cry]

MessaggioInviato: ven nov 04, 2005 2:43 pm
da DilanDog
DilanDog ha scritto:Vediamo se ho capito bene il funzionamento di shl e shr....

Poniamo la variabile test=0x34

34 in binario = 110100
shr 4 = 110100 = 4
shl 4 = 110100 = 4
shl 5 = 110100 = 14


Giusto? Si vede che in vb le funzioni di shift non ci sono... [cry]


Qualcuno riesce a chiarirmi le funzioni di shift shl e shr del pascal (vedi post precedente)? [cry+]

MessaggioInviato: ven nov 04, 2005 3:02 pm
da Xerex
Lo shift sposta tutti bit di n posti:

se hai 11001101
e lo shifti da una parte di diciamo 3 ottieni:

00011001

dall'altra

01101000

MessaggioInviato: mar nov 22, 2005 10:45 am
da DilanDog
Alla fine sono riuscito a trovare una libreria che mi calocla direttamente il CRC di una stringa (il pezzo di codice in pascal serviva proprio a quello) ed ho risolto il problema [applauso]

Grazie a tutti comunque [^]