Test Funzione C# - CHECKSUMME

di il
8 risposte

Test Funzione C# - CHECKSUMME

Buongiorno,
mi sono appena iscritto al forum per avere un aiuto da parte vostra,
ho qualche conoscenza di programmazione in Delphi, e dovevo trasportare una semplice funzione da C# a Delphi, è una funzione che esegue un calcolo di controllo su una stringa, dovrebbe abbastanza semplice, ma non riesco ad ottenere il valore che dovrei.

Chi ha ricavato questo piccolo algoritmo è sicuro che il risultato di questa funzione eseguita su questa stringa: CHECKSUMME02B2 dia come risultato S,

io non ho modo di testarla direttamente in C#, se qualcuno può cortesemente testarla
la funzione in oggetto è la seguente:

public char CalculateCheckDigit(string text)
{
    string characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int position = 0;
    for (int i = 0; i < text.Length; i++)
    {
        int index = characters.IndexOf(text[i]);
        if (i % 2 == 0)
            index *= 3;
        position += index;
    }
    position %= 36; 
    return characters[position];
}
io l'ho "tradotta" così

function CalculateCheckDigit(sText: string): char;
var
i, index, iPosition: integer;
characters: string;

begin
characters:=  '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
iPosition:= 0;
for i:= 0 to length(sText) do
  begin
  index:= pos(sText[i], characters);
  if i mod 2 = 0 then
     begin
     index:= index * 3;
     end;
     iPosition:= iPosition + index;
  end;
iPosition:= iPosition mod 36;
result:=  characters[iPosition];
end;
A questo punto mi sorgono due dubbi, il primo è che il carattere [0] di una variabile stringa, in questo caso characters[0] non contiene il carattere '0', ma questo è contenuto del characters[1] ,
poi, leggendo la mia trauzione, non riesco ad individuare cosa fa se (i mod 2 = 0) è diverso da Zero.

le cifre di controllo che riporto qui di seguito sono sicure perchè lette all'interno del file che sto esaminando:

($CHECKSUMME AA5B L) il CalculateCheckDigit dovrebbe essere fatto su: CHECKSUMMEAA5B e restituire L
($CHECKSUMME 9EDD C) il CalculateCheckDigit dovrebbe essere fatto su: CHECKSUMME9EDD e restituire C

grazie in anticipo

8 Risposte

  • Re: Test Funzione C# - CHECKSUMME

    Fai attenzione ... questa è la sezione C/C++ non C# !

    Fai spostare da un moderatore e usa i tag CODE per il codice !
    Se sei appena iscritto, leggi prima il regolamento e come si usa il forum.
  • Re: Test Funzione C# - CHECKSUMME

    Ho spostato la discussione
    X maxpayne1961: a te mettere il codice tra i tag e leggere le regole del forum
  • Re: Test Funzione C# - CHECKSUMME

    Comunque, sì, in output da quella funzione hai il carattere S
  • Re: Test Funzione C# - CHECKSUMME

    oregon ha scritto:


    Comunque, sì, in output da quella funzione hai il carattere S
    
    public char CalculateCheckDigit(string text)
    {
        string characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int position = 0;
        for (int i = 0; i < text.Length; i++)
        {
            int index = characters.IndexOf(text[i]);
            if (i % 2 == 0)
                index *= 3;
            position += index;
        }
        position %= 36; 
        return characters[position];
    }
    
    Grazie non avevo letto attentamente tutto il regolamento ...

    la funzione allora è giusta, quindi l'ho traspotata male ...

    scusa la mia descrizione, ma non conosco il C#, sono andato a cercare anche la sintassi dei cicli, ma non sono riuscito a capire tutto specialmente su come vengono gestiti i blocchi di codice,

    -> in pratica inizia il ciclo "for" da i= 0 fino alla lunghezza di text
    -> incremenenta "i" ad ogni fine di ciclo
    -> assegna ad index la posizione del carattere di "text" in esame cercato in "characters"
    -> se "i" è pari index è uguale a index + index moltiplicato 3
    -> se" i" è dispari non fa niente ...
    -> in ogni caso all'interno del ciclo "for" "position" è uguale a "position" + "index"

    una volta finito il ciclo "position" è uguale al resto di "position" diviso 36

    poi cerca in "characters" il carattere relativo a "position" ...

    è giusta questa interpretazione ?

    Grazie ...
  • Re: Test Funzione C# - CHECKSUMME

    ... da 0 fino alla lunghezza di text-1 (il ciclo si conclude con =)

    Cioè, se la stringa è lunga 5 caratteri, il ciclo sarà da 0 a 4 (base 0)
  • Re: Test Funzione C# - CHECKSUMME

    oregon ha scritto:


    ... da 0 fino alla lunghezza di text-1 (il ciclo si conclude con =)

    Cioè, se la stringa è lunga 5 caratteri, il ciclo sarà da 0 a 4 (base 0)
    ok,
    non so hai qualche nozione di Pascal, ma io l'to "tradotta" così, però non funziona ...
    dove sbaglio ?
    
    function TFormBMWConfronta_0da.CalculateCheckDigit(sText: string): char;
    var
    i, index, iPosition: integer;
    characters: string;
    
    begin
    characters:= '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    iPosition:= 0;
    for i:= 0 to length(sText) do
      begin
      index:= pos(sText[i], characters);
      if (i mod 2) = 0 then
         begin
         index:= index * 3;
         end;
         iPosition:= iPosition + index;
      end;
    iPosition:= iPosition mod 36;
    result:=  characters[iPosition];
    end;
    
    ho provato ad usare anche una array di caratteri il posto della stringa per ovviare al carattere [0] delle tringhe ma non funziona lo stesso
    //characters: array[0..35] of char = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
  • Re: Test Funzione C# - CHECKSUMME

    Alcune correzioni
    
    for i:= 0 to length(sText)-1 do
    
    
          index:= pos(sText[i+1], characters)-1;
    
    
        result:=  characters[iPosition+1];
    
  • Re: Test Funzione C# - CHECKSUMME

    Grazie mille ....

    Funziona perfettamente ....
Devi accedere o registrarti per scrivere nel forum
8 risposte