CRC of a message char array

i have a char array[100] , with comma seperated tokens like ?>100,1023,255..\n

whats the best way of generating a CRC for it ?shall i just generate the CRC for tokens or the whole array including the \n and , ?
and would i be generating the CRC for each char and then combining the CRC or how does it work?

thanks
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <cstdint>

class Crc32{
    std::uint32_t crc32;
    static std::uint32_t lookup[];
public:
    Crc32(){
        this->clear();
    }
    void clear(){
        this->crc32 ^= ~this->crc32;
    }
    template <size_t N>
    void input(const char (&message_array)[N]){
        this->input(message_array, N);
    }
    void input(const void *message_array, size_t length){
        const std::uint8_t *array = (const std::uint8_t *)message_array;
        for (; length; length--, array++)
            this->input(*array);
    }
    void input(std::uint8_t message_element){
        this->crc32 = (this->crc32 >> 8) ^ lookup[message_element ^ (this->crc32 & 0xFF)];
    }
    std::uint32_t result() const{
        return ~this->crc32;
    }
};

std::uint32_t Crc32::lookup[] = {
    0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535,0x9E6495A3,
    0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91,
    0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7,
    0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,
    0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,
    0x35B5A8FA,0x42B2986C,0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,
    0x26D930AC,0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F,
    0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB,0xB6662D3D,
    0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F,0x9FBFE4A5,0xE8B8D433,
    0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,0x086D3D2D,0x91646C97,0xE6635C01,
    0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,
    0x65B0D9C6,0x12B7E950,0x8BBEB8EA,0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,
    0x4DB26158,0x3AB551CE,0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,
    0x4369E96A,0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9,
    0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,0xCE61E49F,
    0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,0xB7BD5C3B,0xC0BA6CAD,
    0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739,0x9DD277AF,0x04DB2615,0x73DC1683,
    0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8,0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,
    0xF00F9344,0x8708A3D2,0x1E01F268,0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,
    0xFED41B76,0x89D32BE0,0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,
    0xD6D6A3E8,0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B,
    0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF,0x4669BE79,
    0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703,0x220216B9,0x5505262F,
    0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7,0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,
    0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A,0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,
    0x95BF4A82,0xE2B87A14,0x7BB12BAE,0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,
    0x86D3D2D4,0xF1D4E242,0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,
    0x88085AE6,0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45,
    0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D,0x3E6E77DB,
    0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9,
    0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,0xCDD70693,0x54DE5729,0x23D967BF,
    0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D
};

int main(){
    char input[] = "?>100,1023,255..\n";
    Crc32 crc32;
    crc32.input(input);
    std::cout << crc32.result() << std::endl;
    return 0;
}
sorry about delayed reply , I was away.
I am not able to use iostream in AVR-GCC ,its not supported , can you write this code not using iostream please?

thanks
Change <iostream> to <cstdio> and change line 70 to
 
printf("%u\n", crc32.result());

Can't you even figure this out on your own?
hi Helios
I just found out that cstdio or cstdint are not available for AVR GCC 32 bit
Can we use stdio or stdint instead as they are available for my Micro ?
Last edited on
I tried to compile the code with stdio and stdint but I get error
"Uint32_t in name space 'std' does not name a type"
can anyone reply to this thread please ?I really need this CRC routine working
thanks
I suspect nobody is responding because you are simply asking us to do your work for you. If you don't understand something, ask a question about it, but don't just say "give it to me a different way".

You tried compiling the code with stdio and stdint header files, but stopped when you got an error message and immediately came back to the forum for help. Actually, you came back and stated you had another compile error, but didn't ask for help.

Did you bother looking at the contents of stdint? Do you know what a name space is? Do you know what a type is? Do you have experience programming?

People on this forum want to help people who put in effort and run into road blocks. When someone appears to be doing nothing other than copying code from posts and asking for updates, the forum dwellers here have no motivation to expend energy to help out.
Yep, pretty much what doug4 said.

If you're too incompetent to do your job you should do the honest thing and quit so someone else can do it, not ask strangers on the Internet to do it for you for free.
Well said!
sorry iam willing to learn and I am new at programming though but this is a huge task to handle it seems.
I know what a class and type is but I don't know what a name space is. I will do the reading .
any particular thing you can advise on reading which will help me learn this particular area of programming ?
I am new at programming though but this is a huge task to handle

This is not a good combination. If this is school, you should have a teacher you can talk to. If this is a job, then you should have a boss to talk to. If you are an entrepreneur and have no one to talk to, then you will be struggling with a lot until you get more experience.

C++ has name spaces that allow you to group different tokens into associated groups. Google it if you want more details. The primary namespace of C++ is "std". In cstdint, the type uint32_t is declared in the std namespace.

C does not have namespaces. Because your compiler does not allow the inclusion of certain C++ header files, you are including the C equivalent of the header file. Read through the file and I bet you find the declaration of type uint32_t not in a namespace. Just get rid of the "std::" in the code that @helios gave you and try again.

You are working in a strange situation. I did a quick google search on AVR GCC and it looks like that environment supports C++ syntax but not the standard C++ libraries. You are going to keep running into problems like this in the future. You have a few options:
- Move to a different environment that supports real C++
- Program in C rather than C++
- Learn C and C++ well enough that you can take suggestions from a C++ forum and translate into something workable on your system.
thanks I got it to compile , I also read about name spaces and constructs .
I am trying to learn how this program is working and here is what I understand.

1
2
3
    class Crc32{
    uint32_t crc32;
    static uint32_t lookup[];

this declares a class called Crc32 with two variables crc32 and and array var lookup[]

1
2
3
4
    public:
    Crc32(){
        this->clear();
    }


this will create a constructor member function which runs on every instantiation of this class (Crc32) and calls the clear() function .

1
2
3
    void clear(){
        this->crc32 ^= ~this->crc32;
    }


this is the member function (method) to clear the current class object , I am not sure if it means clearing the lookup[] array or does it means more than that ?
"this->" XOR with the NOT "this->" would give zero.

1
2
   template <size_t N>
    void input(const char (&message_array)[N]

at this point I am lost , I tried to read about template but I didn't understand well.
also I am not understanding how we can have three member functions with same name (input) .

can you guide me in understanding the logic and working of this code ?

thanks
x ^= ~x turns on all the bits of x if x is an unsigned integer of any size.

A class can have any number of functions with the same name as long as they take different parameters. The functions in such a case are said to be overloads of each other.
All the template overload of input() does is use the type information that exists at compile time to automatically fill in the size parameter for Crc32::input(const void *, size_t). See line 69 where I did crc32.input(input). Without that overload, I would have had to write crc32.input(input, sizeof(input))
oh yes XOR gate properties is if bits are similar output is zero otherwise 1, so e.g 1011 ^= ~1011 means 1011 ^= 0100 thus all bits become high.
but why would you turn all bits high ? and what does turning the bits high means in context of a class ?

also I am reading there are two methods of CRC calculation , the polynomial method or lookup table method. so the lookup[] array in your code is this lookup table ? something standard for crc calculations?
Last edited on
but why would you turn all bits high ?
The CRC32 algorithm uses a 32-bit state that's initialized to all ones. That's just the way it works.

what does turning the bits high means in context of a class ?
What do you mean?

so the lookup[] array in your code is this lookup table ?
Obviously.

something standard for crc calculations?
You could say that. If you use a table with different values you'll get a different value from what all CRC32 implementations return, possibly not even a CRC at all.
Topic archived. No new replies allowed.