# 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 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 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
Next
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) ])
Next
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

OS: Win10-1709 - 64bit - German, AutoIt Version: 3.3.14.2, AutoIt Editor: SciTE, Website: http://www.funk.eu, My unsolved Questions: Get default Window Size and Position, Rotate display by 270 degrees, Get Systray Icons, ...

##### 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 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

## 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

×

• Wiki

• Back

• Git

## Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.