Jump to content
Sign in to follow this  

Help with calculating 8-bit checksum (CRC8)

Recommended Posts


Hello all,

please, can someone help me how to calculate checksum file: CRC-8? I am no expert on computing bytes and I tried browse this forum, but found nothing :D Is CRC8 ascii sum of all bytes and multiply of 256? And,... Is there any quick method for this calculation, because I need to calculate a CRC8 checksum for each file in my folder (etimated File size is 10+ MB)? Thanks for any reply or guidance.

Share this post

Link to post
Share on other sites

Not sure, try this

Dim $avTest[5] = ["Test line 1.", "abcdefghijklmnopqrstuvwxyz01234567890", 0xFEDCBA98, "", StringToBinary("Binary test.")]
$sMsg = ""
For $n = 0 To UBound($avTest) - 1
    $sMsg &= $avTest[$n] & " CRC8 = " & _StringCrc8($avTest[$n]) & @CRLF
MsgBox(64, "StringCrc8 Test", $sMsg)

; =======================================================
; Function  _StringCrc8
; Purpose:  Return the CRC8 checksum of the input value
; Author:   CRC16 example by roby and PsaltyDS at http://www.autoitscript.com/forum/index.php?showtopic=55402&view=findpost&p=420336
;           CRC8 by KaFu derived from CRC16 and a CRC8 table found here http://snippets.dzone.com/tag/crc8
; =======================================================
Func _StringCrc8($value)
    Local $crc = 0x0000, $i = 0
    Local $table[256] = [ _
        0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, _ 
        0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d, _ 
        0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65, _ 
        0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d, _ 
        0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, 0xf2, 0xf5, _ 
        0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd, _ 
        0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85, _ 
        0xa8, 0xaf, 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd, _ 
        0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2, _ 
        0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea, _ 
        0xb7, 0xb0, 0xb9, 0xbe, 0xab, 0xac, 0xa5, 0xa2, _ 
        0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a, _ 
        0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32, _ 
        0x1f, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0d, 0x0a, _ 
        0x57, 0x50, 0x59, 0x5e, 0x4b, 0x4c, 0x45, 0x42, _ 
        0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a, _ 
        0x89, 0x8e, 0x87, 0x80, 0x95, 0x92, 0x9b, 0x9c, _ 
        0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4, _ 
        0xf9, 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec, _ 
        0xc1, 0xc6, 0xcf, 0xc8, 0xdd, 0xda, 0xd3, 0xd4, _ 
        0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c, _ 
        0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, 0x43, 0x44, _ 
        0x19, 0x1e, 0x17, 0x10, 0x05, 0x02, 0x0b, 0x0c, _ 
        0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34, _ 
        0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b, _ 
        0x76, 0x71, 0x78, 0x7f, 0x6a, 0x6d, 0x64, 0x63, _ 
        0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b, _ 
        0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13, _ 
        0xae, 0xa9, 0xa0, 0xa7, 0xb2, 0xb5, 0xbc, 0xbb, _ 
        0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8d, 0x84, 0x83, _ 
        0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb, _ 
        0xe6, 0xe1, 0xe8, 0xef, 0xfa, 0xfd, 0xf4, 0xf3 ]

    ConsoleWrite("Debug: $value = " & $value & "  Len = " & StringLen($value) & @LF)
    For $i = 1 To StringLen($value)
        $crc = BitXOR(BitShift($crc, 8), $table[BitAND(BitXOR($crc, Asc(StringMid($value, $i, 1))), 0xFF) ])
    Return Hex($crc, 4)
EndFunc ;==>_StringCrc8

Derived from this example #420336 by roby and PsaltyDS, add this crc8 table http://snippets.dzone.com/tag/crc8

To get crc8 from a file I think a fileread of the content to a var and then calc crc8 on that var would do.

Edited by KaFu

Share this post

Link to post
Share on other sites

Many thanks, KaFu for your assistance, but returned value from _StringCrc8() func isn't correct 8-bit CRC. I compare the values with hex editor, which calculates different CRC-8.

I tested this function on the file with size 400kB. My old PC (2.8 GHz Celeron) died after ten minutes :D The second PC (Core Duo 1.7 GHz) returned value after 15 sec, but with wrong value. On this forum I found the 32-bit CRC which works incredibly quickly. Is there a possibility to revise it to CRC8?

Edited by ancp

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this