Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search

[REBOL] Re: checksum calculation

From: rebol-list2:seznam:cz at: 11-Sep-2003 14:31

Hello Anton, Thursday, September 11, 2003, 9:48:38 AM, you wrote: AR> Hi Oldes, AR> Well, what have you got so far? AR> I suppose your algorithm in rebol doesn't match the AR> one in C? Thanx Anton... your script helped me very much... Yes... almost none of checksums I've found in binary formats I was working with doesn't match the rebol's one:( Another problem with rebol's checksum is that it's not possible to use it on large files or data streams, because it first loads all the content into memory. I was trying to use it (for example) for counting md5 checksums of redhat distribution cds and I have to say it's useless:( You script was not working but I found the right way how to detect the length and improved your script to this one (with a hope that negative overflow should never happen) and it's working:)) ULONG: [;(byte-order is Big Endian) copy v 4 skip ( v: to binary! v v: either #{80000000} = and v #{80000000} [ 2147483648 + to integer! (and v #{7FFFFFFF}) ][to integer! v] ) ] ;returns decimal if the u.integer is >= 2147483648 calc-table-checksum: func [table [binary!] /local sum length n][ sum: 0 ; (unsigned long integer) length: length? table if 0 < n: length // 4 [ length: length + 4 - n insert/dup tail table #{00} (4 - n) ;print "padding" ] ; step through the table data in chunks of four bytes parse/all table [ any [ ULONG ( either error? try [sum: sum + v][ ;print "positive overflow" sum: sum - 4294967296 + v ][ if sum >= 4294967295 [sum: sum - 4294967296] ] ) ] ] either positive? sum [sum][sum + 4294967296] ] -- Best regards, rebOldes -----------------[ ]