23. marts 2000 - 13:49Der 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. "," ?
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;
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;
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.
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;
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.