Avatar billede chris13 Nybegynder
23. marts 2000 - 13:49 Der er 13 kommentarer og
1 løsning

Hvordan: tage tegn fra string => conv. til hex => tælle checksum => næste tegn.

Hvordan kan jeg løse dette:
Jeg har en streng ala "ABCDEF,12,12", hvordan kan jeg tage et tegn ad gangen fra strengen, konvertere det til hex, og så tælle hex værdien op i en variabel (integer formoder jeg), og fremdeles ved de andre tegn i strengen incl. "," ?

Altså kort, beregne 8 bits checksum på strengen ?

mvh

Christian
Avatar billede sjensen Nybegynder
23. marts 2000 - 14:19 #1
således

procedure summer(streng : string);
var i : integer;
    sum : integer;
begin
  for i := 1 to length(streng) do
  begin
    sum := sum + ord(s[i]);
  end;
  showmessage('Summen er: '+inttostr(sum));
end;

Du behøver ikke at bruge hex-værdien til det
Avatar billede sjensen Nybegynder
23. marts 2000 - 14:22 #2
Jeg skulle måske lige forklare at

ord(char) = ascii-værdien i decimal:

ex.
ord('A') = 65
ord('a') = 97  (små tegn er 32 større end store tegn)
ord(',') = 44

Avatar billede retep Nybegynder
23. marts 2000 - 14:23 #3
Hvorfor vil du omregne noget af det til HEX-værdier, og tage Ascii værdien for et ","?

Jeg er ikke helt sikker på at jeg forstår hvad det er du vil... Kan du ikke uddybe det lidt?

Avatar billede dj Nybegynder
23. marts 2000 - 14:24 #4
jeg ved ikke helt om det her er hvad du vil, jeg kan bl.a. ikke se hvorfor du vil konvertere til HEX først.. men nedenstående function giver dig en sum udregnet ud fra de tegn der er brugt i strengen.

function chksum(text: string):integer;
var
  final, I: integer;
  key: word;
begin
  final:=0;
  if text='' then begin
  result:=0;
  exit;
  end;
  for I:=1 to length(text) do begin
    Key := (byte(text[I]));
    Final := final + key;
  end;
  result:=final;
end;

Mvh. _DJ_
Avatar billede dj Nybegynder
23. marts 2000 - 14:25 #5
sorry, Sjensen, jeg havde ikke lige opdateret siden så jeg så ikke at du allerede havde skrevet næsten det samme som mig ..
Avatar billede retep Nybegynder
23. marts 2000 - 14:26 #6
Woops, der kom Sjensen ind før mig... Men hans løsning er også det som jeg havde forestillet mig som løsningen.

Husk lige:
Sum := 0;

før for-løkken...

Avatar billede retep Nybegynder
23. marts 2000 - 14:26 #7
Aargh, hver gang jeg skriver noget,  kommer der nogen ind før mig :-)
Avatar billede dj Nybegynder
23. marts 2000 - 14:31 #8
btw. så omdanner eksperten 2 * ' til ' så der hvor der står

"if text=' then begin" skal altså være med 2 ' er

heh :o)
Avatar billede chris13 Nybegynder
23. marts 2000 - 15:29 #9
Jeg har valgt "dj"'s svar, men du har kun kommenteret, så jeg kan ikke give dig point. Kan du ikke svare ??

mvh

Christian
Avatar billede hatecaps Nybegynder
23. marts 2000 - 23:49 #10
retep >> sum := 0 er ikke nødvendig da variablen kreeres hver gang proceduren kaldes

dj>>  syntes du ikke det er på tide at de laver det om !!?! ;-)

chris13 >> hvorfor vælge en løsning med dobbelt så meget kode, men med samme resultat ?

hatecaps >> stop med alle disse kommentarer !!
Avatar billede pellelil Nybegynder
26. marts 2000 - 11:01 #11
hatecaps >> det er ikke nogen god skik ikke at initializere sine variabler

Med hensyn til de 2 eksempler så vil jeg blot pointere at en "rigtig" CRC funktion kaldes med en "Initial Value". Hvis du ekempelvis vil beregne CRC værdien for en fil som du læser i blokke af 32K hvad så ?. Hvis du vil beregne CRC-værdien af en fil på eksempelvis 1 MB, så skal det være fuldstændig lige meget om det gør det i blokke af 1, 2, 16, 64 (whatever) - resultatet SKAL være det samme.

CRC funktionen skal således kaldes første gang med (initial værdien) 0 og herefter kaldes med værdien som det "forrige" kald returnerede (det lyder ca. 4 gange så indviklet som det egentlig er).

Et andet problem med de viste funktioner er at de blot addere værdi af tegnene, det vil sige at hvis du bytter 2 tegn i strengen vil den stadig give samme værdi ("DETTE ER EN TEST" = "DEEEEE  STT")

En helt anden ting er at hvis du vil lave en 8 bit CRC så skal resultatet af CRC rutinen være et 8 bit resultat. Både CRC16 og CRC32 kigger kun på et tegn (altså 8 bit) af gangen, men resultatet er henholdsvis 16 og 32 bit - deraf navnet.

En CRC8 routine kunne se ud som flg:

Function (szStr : String; iInitial : Integer) : Byte;
iIdx : Integer;
begin
  Result := iInitial;
  for iIdx := 1 to Length(szStr) do begin
    Result := Result xor szStr[iIdx];
  end;
end;

Netop fordi en CRC8 kun returnere en 8 bit værdi, så er så er changen for at en fejlbehæftet streng returnere den rigtige værdi 1:256 hvor en CRC32 giver en fejlmargen på 1:2^32.
Avatar billede pellelil Nybegynder
26. marts 2000 - 11:04 #12
Ok jeg kan ikke tælle, det skulle have været "DETTE ER EN TEST" = "DEEEEE  NRSTTTT"

Men "billedet" var vel klart nok
Avatar billede pellelil Nybegynder
26. marts 2000 - 11:14 #13
Ret skal være ret og jeg kan se at min egen rutine ikke er et hak bedre med med hensyn til byttede tegn, så det skal laves anderledes for at være mere sikker (og så lugtger den også lidt af CRC32):

Function (szStr : String; iInitial : Integer) : Byte;
var
  iIdx : Integer;
begin
  Result := iInitial;
  for iIdx := 1 to Length(szStr) do begin
    Result := (Result shl 1) xor szStr[iIdx];
  end;
end;

Avatar billede dj Nybegynder
26. marts 2000 - 13:17 #14
her er et svar :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester