שתף באמצעות


CRC8 checksum with lookup table

Question

Tuesday, November 12, 2013 7:33 AM

Hi All,

I want to translate the folowing code in C to VB.net.

The CRC‐8 algorithm can be implemented with the following C code: polynomial '100100101'
pass in pointer to data, number of bytes, and 0 as the initial crc value.
unsigned char calculate_crc(const unsigned char * ptr, unsigned length, unsigned char crc)
{
static const unsigned char crc_table[256] =
{
0x00, 0x25, 0x4A, 0x6F, 0x94, 0xB1, 0xDE, 0xFB,
0x0D, 0x28, 0x47, 0x62, 0x99, 0xBC, 0xD3, 0xF6,
0x1A, 0x3F, 0x50, 0x75, 0x8E, 0xAB, 0xC4, 0xE1,
0x17, 0x32, 0x5D, 0x78, 0x83, 0xA6, 0xC9, 0xEC,
0x34, 0x11, 0x7E, 0x5B, 0xA0, 0x85, 0xEA, 0xCF,
0x39, 0x1C, 0x73, 0x56, 0xAD, 0x88, 0xE7, 0xC2,
0x2E, 0x0B, 0x64, 0x41, 0xBA, 0x9F, 0xF0, 0xD5,
0x23, 0x06, 0x69, 0x4C, 0xB7, 0x92, 0xFD, 0xD8,
0x68, 0x4D, 0x22, 0x07, 0xFC, 0xD9, 0xB6, 0x93,
0x65, 0x40, 0x2F, 0x0A, 0xF1, 0xD4, 0xBB, 0x9E,
0x72, 0x57, 0x38, 0x1D, 0xE6, 0xC3, 0xAC, 0x89,
0x7F, 0x5A, 0x35, 0x10, 0xEB, 0xCE, 0xA1, 0x84,
0x5C, 0x79, 0x16, 0x33, 0xC8, 0xED, 0x82, 0xA7,
0x51, 0x74, 0x1B, 0x3E, 0xC5, 0xE0, 0x8F, 0xAA,
0x46, 0x63, 0x0C, 0x29, 0xD2, 0xF7, 0x98, 0xBD,
0x4B, 0x6E, 0x01, 0x24, 0xDF, 0xFA, 0x95, 0xB0,
0xD0, 0xF5, 0x9A, 0xBF, 0x44, 0x61, 0x0E, 0x2B,
0xDD, 0xF8, 0x97, 0xB2, 0x49, 0x6C, 0x03, 0x26,
0xCA, 0xEF, 0x80, 0xA5, 0x5E, 0x7B, 0x14, 0x31,
0xC7, 0xE2, 0x8D, 0xA8, 0x53, 0x76, 0x19, 0x3C,
0xE4, 0xC1, 0xAE, 0x8B, 0x70, 0x55, 0x3A, 0x1F,
0xE9, 0xCC, 0xA3, 0x86, 0x7D, 0x58, 0x37, 0x12,
0xFE, 0xDB, 0xB4, 0x91, 0x6A, 0x4F, 0x20, 0x05,
0xF3, 0xD6, 0xB9, 0x9C, 0x67, 0x42, 0x2D, 0x08,
0xB8, 0x9D, 0xF2, 0xD7, 0x2C, 0x09, 0x66, 0x43,
0xB5, 0x90, 0xFF, 0xDA, 0x21, 0x04, 0x6B, 0x4E,
0xA2, 0x87, 0xE8, 0xCD, 0x36, 0x13, 0x7C, 0x59,
0xAF, 0x8A, 0xE5, 0xC0, 0x3B, 0x1E, 0x71, 0x54,
0x8C, 0xA9, 0xC6, 0xE3, 0x18, 0x3D, 0x52, 0x77,
0x81, 0xA4, 0xCB, 0xEE, 0x15, 0x30, 0x5F, 0x7A,
0x96, 0xB3, 0xDC, 0xF9, 0x02, 0x27, 0x48, 0x6D,
0x9B, 0xBE, 0xD1, 0xF4, 0x0F, 0x2A, 0x45, 0x60
};

while (length‐‐)
crc = crc_table[crc ^ *ptr++];
return crc;

I came as far as this, but a don't understand this bit of c code:

while (length‐‐)
crc = crc_table[crc ^ *ptr++];
return crc;

Private Shared CrcTable As UShort() = {&H0, &H25, &H4A, &H6F, &H94, &HB1, &HDE, &HFB, _
        &HD, &H28, &H47, &H62, &H99, &HBC, &HD3, &HF6, _
        &H1A, &H3F, &H50, &H75, &H8E, &HAB, &HC4, &HE1, _
        &H17, &H32, &H5D, &H78, &H83, &HA6, &HC9, &HEC, _
        &H34, &H11, &H7E, &H5B, &HA0, &H85, &HEA, &HCF, _
        &H39, &H1C, &H73, &H56, &HAD, &H88, &HE7, &HC2, _
        &H2E, &HB, &H64, &H41, &HBA, &H9F, &HF0, &HD5, _
        &H23, &H6, &H69, &H4C, &HB7, &H92, &HFD, &HD8, _
        &H68, &H4D, &H22, &H7, &HFC, &HD9, &HB6, &H93, _
        &H65, &H40, &H2F, &HA, &HF1, &HD4, &HBB, &H9E, _
        &H72, &H57, &H38, &H1D, &HE6, &HC3, &HAC, &H89, _
        &H7F, &H5A, &H35, &H10, &HEB, &HCE, &HA1, &H84, _
        &H5C, &H79, &H16, &H33, &HC8, &HED, &H82, &HA7, _
        &H51, &H74, &H1B, &H3E, &HC5, &HE0, &H8F, &HAA, _
        &H46, &H63, &HC, &H29, &HD2, &HF7, &H98, &HBD, _
        &H4B, &H6E, &H1, &H24, &HDF, &HFA, &H95, &HB0, _
        &HD0, &HF5, &H9A, &HBF, &H44, &H61, &HE, &H2B, _
        &HDD, &HF8, &H97, &HB2, &H49, &H6C, &H3, &H26, _
        &HCA, &HEF, &H80, &HA5, &H5E, &H7B, &H14, &H31, _
        &HC7, &HE2, &H8D, &HA8, &H53, &H76, &H19, &H3C, _
        &HE4, &HC1, &HAE, &H8B, &H70, &H55, &H3A, &H1F, _
        &HE9, &HCC, &HA3, &H86, &H7D, &H58, &H37, &H12, _
        &HFE, &HDB, &HB4, &H91, &H6A, &H4F, &H20, &H5, _
        &HF3, &HD6, &HB9, &H9C, &H67, &H42, &H2D, &H8, _
        &HB8, &H9D, &HF2, &HD7, &H2C, &H9, &H66, &H43, _
        &HB5, &H90, &HFF, &HDA, &H21, &H4, &H6B, &H4E, _
        &HA2, &H87, &HE8, &HCD, &H36, &H13, &H7C, &H59, _
        &HAF, &H8A, &HE5, &HC0, &H3B, &H1E, &H71, &H54, _
        &H8C, &HA9, &HC6, &HE3, &H18, &H3D, &H52, &H77, _
        &H81, &HA4, &HCB, &HEE, &H15, &H30, &H5F, &H7A, _
        &H96, &HB3, &HDC, &HF9, &H2, &H27, &H48, &H6D, _
        &H9B, &HBE, &HD1, &HF4, &HF, &H2A, &H45, &H60}

Any help would be appreciated!!

In this example message is 34 32 the checksum.

02 30 31 30 32 32 33 32 03 34 32                      

All replies (5)

Thursday, November 21, 2013 10:25 AM ✅Answered

@ Monkeyboy :This is C code, not C#

@ Jochem

That would be that

Public Class Form1


    Private Shared CrcTable() As Byte = {&H0, &H25, &H4A, &H6F, &H94, &HB1, &HDE, &HFB, _
        &HD, &H28, &H47, &H62, &H99, &HBC, &HD3, &HF6, _
        &H1A, &H3F, &H50, &H75, &H8E, &HAB, &HC4, &HE1, _
        &H17, &H32, &H5D, &H78, &H83, &HA6, &HC9, &HEC, _
        &H34, &H11, &H7E, &H5B, &HA0, &H85, &HEA, &HCF, _
        &H39, &H1C, &H73, &H56, &HAD, &H88, &HE7, &HC2, _
        &H2E, &HB, &H64, &H41, &HBA, &H9F, &HF0, &HD5, _
        &H23, &H6, &H69, &H4C, &HB7, &H92, &HFD, &HD8, _
        &H68, &H4D, &H22, &H7, &HFC, &HD9, &HB6, &H93, _
        &H65, &H40, &H2F, &HA, &HF1, &HD4, &HBB, &H9E, _
        &H72, &H57, &H38, &H1D, &HE6, &HC3, &HAC, &H89, _
        &H7F, &H5A, &H35, &H10, &HEB, &HCE, &HA1, &H84, _
        &H5C, &H79, &H16, &H33, &HC8, &HED, &H82, &HA7, _
        &H51, &H74, &H1B, &H3E, &HC5, &HE0, &H8F, &HAA, _
        &H46, &H63, &HC, &H29, &HD2, &HF7, &H98, &HBD, _
        &H4B, &H6E, &H1, &H24, &HDF, &HFA, &H95, &HB0, _
        &HD0, &HF5, &H9A, &HBF, &H44, &H61, &HE, &H2B, _
        &HDD, &HF8, &H97, &HB2, &H49, &H6C, &H3, &H26, _
        &HCA, &HEF, &H80, &HA5, &H5E, &H7B, &H14, &H31, _
        &HC7, &HE2, &H8D, &HA8, &H53, &H76, &H19, &H3C, _
        &HE4, &HC1, &HAE, &H8B, &H70, &H55, &H3A, &H1F, _
        &HE9, &HCC, &HA3, &H86, &H7D, &H58, &H37, &H12, _
        &HFE, &HDB, &HB4, &H91, &H6A, &H4F, &H20, &H5, _
        &HF3, &HD6, &HB9, &H9C, &H67, &H42, &H2D, &H8, _
        &HB8, &H9D, &HF2, &HD7, &H2C, &H9, &H66, &H43, _
        &HB5, &H90, &HFF, &HDA, &H21, &H4, &H6B, &H4E, _
        &HA2, &H87, &HE8, &HCD, &H36, &H13, &H7C, &H59, _
        &HAF, &H8A, &HE5, &HC0, &H3B, &H1E, &H71, &H54, _
        &H8C, &HA9, &HC6, &HE3, &H18, &H3D, &H52, &H77, _
        &H81, &HA4, &HCB, &HEE, &H15, &H30, &H5F, &H7A, _
        &H96, &HB3, &HDC, &HF9, &H2, &H27, &H48, &H6D, _
        &H9B, &HBE, &HD1, &HF4, &HF, &H2A, &H45, &H60}

    '<-- ptr is the index of an array of char (Byte) Your code dont 
    'show the array, so I assumed as string
    Public SomeData As String = "CrazyPennie"

    Function _CRC() As Byte
        Dim length As Integer = SomeData.Length
        Dim crc As Byte = 0
        Dim ptr As Integer = 0
        While length > -1
            length -= 1
            crc = CrcTable(crc Xor Asc(SomeData(ptr)))
            ptr += 1
        End While
        Return crc
    End Function

Thursday, November 21, 2013 6:08 PM ✅Answered

@ Monkeyboy :This is C code, not C#

@ Jochem

That would be that

Public Class Form1


    Private Shared CrcTable() As Byte = {&H0, &H25, &H4A, &H6F, &H94, &HB1, &HDE, &HFB, _
        &HD, &H28, &H47, &H62, &H99, &HBC, &HD3, &HF6, _
        &H1A, &H3F, &H50, &H75, &H8E, &HAB, &HC4, &HE1, _
        &H17, &H32, &H5D, &H78, &H83, &HA6, &HC9, &HEC, _
        &H34, &H11, &H7E, &H5B, &HA0, &H85, &HEA, &HCF, _
        &H39, &H1C, &H73, &H56, &HAD, &H88, &HE7, &HC2, _
        &H2E, &HB, &H64, &H41, &HBA, &H9F, &HF0, &HD5, _
        &H23, &H6, &H69, &H4C, &HB7, &H92, &HFD, &HD8, _
        &H68, &H4D, &H22, &H7, &HFC, &HD9, &HB6, &H93, _
        &H65, &H40, &H2F, &HA, &HF1, &HD4, &HBB, &H9E, _
        &H72, &H57, &H38, &H1D, &HE6, &HC3, &HAC, &H89, _
        &H7F, &H5A, &H35, &H10, &HEB, &HCE, &HA1, &H84, _
        &H5C, &H79, &H16, &H33, &HC8, &HED, &H82, &HA7, _
        &H51, &H74, &H1B, &H3E, &HC5, &HE0, &H8F, &HAA, _
        &H46, &H63, &HC, &H29, &HD2, &HF7, &H98, &HBD, _
        &H4B, &H6E, &H1, &H24, &HDF, &HFA, &H95, &HB0, _
        &HD0, &HF5, &H9A, &HBF, &H44, &H61, &HE, &H2B, _
        &HDD, &HF8, &H97, &HB2, &H49, &H6C, &H3, &H26, _
        &HCA, &HEF, &H80, &HA5, &H5E, &H7B, &H14, &H31, _
        &HC7, &HE2, &H8D, &HA8, &H53, &H76, &H19, &H3C, _
        &HE4, &HC1, &HAE, &H8B, &H70, &H55, &H3A, &H1F, _
        &HE9, &HCC, &HA3, &H86, &H7D, &H58, &H37, &H12, _
        &HFE, &HDB, &HB4, &H91, &H6A, &H4F, &H20, &H5, _
        &HF3, &HD6, &HB9, &H9C, &H67, &H42, &H2D, &H8, _
        &HB8, &H9D, &HF2, &HD7, &H2C, &H9, &H66, &H43, _
        &HB5, &H90, &HFF, &HDA, &H21, &H4, &H6B, &H4E, _
        &HA2, &H87, &HE8, &HCD, &H36, &H13, &H7C, &H59, _
        &HAF, &H8A, &HE5, &HC0, &H3B, &H1E, &H71, &H54, _
        &H8C, &HA9, &HC6, &HE3, &H18, &H3D, &H52, &H77, _
        &H81, &HA4, &HCB, &HEE, &H15, &H30, &H5F, &H7A, _
        &H96, &HB3, &HDC, &HF9, &H2, &H27, &H48, &H6D, _
        &H9B, &HBE, &HD1, &HF4, &HF, &H2A, &H45, &H60}

    '<-- ptr is the index of an array of char (Byte) Your code dont 
    'show the array, so I assumed as string
    Public SomeData As String = "CrazyPennie"

    Function _CRC() As Byte
        Dim length As Integer = SomeData.Length
        Dim crc As Byte = 0
        Dim ptr As Integer = 0
        While length > -1
            length -= 1
            crc = CrcTable(crc Xor Asc(SomeData(ptr)))
            ptr += 1
        End While
        Return crc
    End Function

Oh. My free Tangible demo code converters snippet converter returned the below code. But I don't know what the "- -" in "Do While Length - -" should mean.

Private Function calculate_crc(ByVal ptr As String, ByVal length As UInteger, ByVal crc As Byte) As Byte
        Dim crc_table() As Byte = {
        &H0, &H25, &H4A, &H6F, &H94, &HB1, &HDE, &HFB,
        &HD, &H28, &H47, &H62, &H99, &HBC, &HD3, &HF6,
        &H1A, &H3F, &H50, &H75, &H8E, &HAB, &HC4, &HE1,
        &H17, &H32, &H5D, &H78, &H83, &HA6, &HC9, &HEC,
        &H34, &H11, &H7E, &H5B, &HA0, &H85, &HEA, &HCF,
        &H39, &H1C, &H73, &H56, &HAD, &H88, &HE7, &HC2,
        &H2E, &HB, &H64, &H41, &HBA, &H9F, &HF0, &HD5,
        &H23, &H6, &H69, &H4C, &HB7, &H92, &HFD, &HD8,
        &H68, &H4D, &H22, &H7, &HFC, &HD9, &HB6, &H93,
        &H65, &H40, &H2F, &HA, &HF1, &HD4, &HBB, &H9E,
        &H72, &H57, &H38, &H1D, &HE6, &HC3, &HAC, &H89,
        &H7F, &H5A, &H35, &H10, &HEB, &HCE, &HA1, &H84,
        &H5C, &H79, &H16, &H33, &HC8, &HED, &H82, &HA7,
        &H51, &H74, &H1B, &H3E, &HC5, &HE0, &H8F, &HAA,
        &H46, &H63, &HC, &H29, &HD2, &HF7, &H98, &HBD,
        &H4B, &H6E, &H1, &H24, &HDF, &HFA, &H95, &HB0,
        &HD0, &HF5, &H9A, &HBF, &H44, &H61, &HE, &H2B,
        &HDD, &HF8, &H97, &HB2, &H49, &H6C, &H3, &H26,
        &HCA, &HEF, &H80, &HA5, &H5E, &H7B, &H14, &H31,
        &HC7, &HE2, &H8D, &HA8, &H53, &H76, &H19, &H3C,
        &HE4, &HC1, &HAE, &H8B, &H70, &H55, &H3A, &H1F,
        &HE9, &HCC, &HA3, &H86, &H7D, &H58, &H37, &H12,
        &HFE, &HDB, &HB4, &H91, &H6A, &H4F, &H20, &H5,
        &HF3, &HD6, &HB9, &H9C, &H67, &H42, &H2D, &H8,
        &HB8, &H9D, &HF2, &HD7, &H2C, &H9, &H66, &H43,
        &HB5, &H90, &HFF, &HDA, &H21, &H4, &H6B, &H4E,
        &HA2, &H87, &HE8, &HCD, &H36, &H13, &H7C, &H59,
        &HAF, &H8A, &HE5, &HC0, &H3B, &H1E, &H71, &H54,
        &H8C, &HA9, &HC6, &HE3, &H18, &H3D, &H52, &H77,
        &H81, &HA4, &HCB, &HEE, &H15, &H30, &H5F, &H7A,
        &H96, &HB3, &HDC, &HF9, &H2, &H27, &H48, &H6D,
        &H9B, &HBE, &HD1, &HF4, &HF, &H2A, &H45, &H60
        }

Do While length‐‐
            crc = crc_table(crc Xor ptr)
            ptr &= 1
        Loop
        Return crc
    End Function
End Class

Please BEWARE that I have NO EXPERIENCE and NO EXPERTISE and probably onset of DEMENTIA which may affect my answers! Also, I've been told by an expert, that when you post an image it clutters up the thread and mysteriously, over time, the link to the image will somehow become "unstable" or something to that effect. :) I can only surmise that is due to Global Warming of the threads.


Tuesday, November 12, 2013 9:56 PM

I don't understand it either

1 - the code re-calculates the crc for each operation, which checksums don't do, they xor the previous result or something similar

2 - the function returns a byte but you say :

In this example message "02 30 31 30 32 32 33 32 03 34 32" is 34 32 the checksum


Wednesday, November 20, 2013 9:49 AM

I am afraid that we cannot change C code to VB.NET Code. Try to call this function in your vb.net code and see the output.


Thursday, November 21, 2013 1:12 AM

Try an online C# to visual basic code converter. I used Telerik. Below is the result for

while (length‐‐)
crc = crc_table[crc ^ *ptr++];
return crc;

While length
    crc = crc_table(crc Xor System.Math.Max(System.Threading.Interlocked.Increment(ptr),ptr - 1).Target)
End While
Return crc

'=======================================================
'Service provided by Telerik (www.telerik.com)
'Conversion powered by NRefactory.
'Twitter: @telerik
'Facebook: facebook.com/telerik
'=======================================================

Please BEWARE that I have NO EXPERIENCE and NO EXPERTISE and probably onset of DEMENTIA which may affect my answers! Also, I've been told by an expert, that when you post an image it clutters up the thread and mysteriously, over time, the link to the image will somehow become "unstable" or something to that effect. :) I can only surmise that is due to Global Warming of the threads.