CRC-8 checksum function

Hello everyone, I need a function that can calculate CRC-8, but this is difficult for me, the C algorithm reference is as follows:

unsigned char CRC8_Check(unsigned char *ptr,unsigned char len)
{ 
    unsigned char crc; 
    unsigned char i; 
      unsigned char j;
    crc = 0;
      if(len>2)
     {
          j=len-2; 
       while(j--)
       { 
          crc ^= *ptr++;
          for(i = 0;i < 8;i++)
          {
             if(crc & 0x80)
             { 
                  crc = (crc << 1) ^ 0x07;
             }
             else crc <<= 1;
          }
       }
    }
    if(ptr[len-2]==crc) 
            return 1; 
    else
            return 0;
}

Can anyone help please? Any help would be appreciated!

You can try to search google "Javascript crc-8 function" then implement it using the function node

Also search this forum. E.g. Help on CRC-8 function - #9 by Steve-Mcl

Thank you very much for your reply, I have tested your node, but it is not the CRC8 checksum result I want, that's why I am posting for help. For example, I want to calculate the string: 7e79030f010002020000000001 with CRC8 checksum result: 0x91, but your node calculates it as: 0xbe, now I don't know what's wrong.


If you are using later version of node-red, you can use the easy-crc package.

If not, let me know and I'll give you a pure node-red function node with lookup table.

using easy-crc in a function...

image

[{"id":"e2beeb574d982801","type":"inject","z":"3b62e67b4dfcce5d","name":"7e79030f010002020000000001","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"7e79030f010002020000000001","payloadType":"str","x":2250,"y":100,"wires":[["4bf21b40a1445e15"]]},{"id":"4bf21b40a1445e15","type":"function","z":"3b62e67b4dfcce5d","name":"crc-8 (easy-crc)","func":"//See https://www.npmjs.com/package/easy-crc?activeTab=readme for list of supported algorithms\nconst { crc8 } = easyCrc;\nconst data = Buffer.from(msg.payload, 'hex');\nmsg.payload = crc8('CRC-8', data);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"easyCrc","module":"easy-crc"}],"x":2160,"y":160,"wires":[["25cd665db5eaa0d9"]]},{"id":"25cd665db5eaa0d9","type":"debug","z":"3b62e67b4dfcce5d","name":"","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":2410,"y":160,"wires":[]}]

steve, thanks a lot for your help!
Could you please give me a node-red function node, because I won't install npm packages outside of node-red. :sweat_smile:

This is a pure node-red function (apart from the import easy-css)

This solution does use an npm package (easy-crc) but you dont have to manually install it (node-red auto installs it)

Is there a specific reason you do NOT want this? Does the node-red not have an internet connection? does your company not permit npm packages?

Yes, I don't have access to install npm packages.

Clipboard 3

The above node is not working for me.

Clipboard 4

Here is a function version...

const CRC8_LOOKUP = [
    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,
]

const crc8 = (current, previous = 0) => {
    let crc = ~~previous;
    for (let index = 0; index < current.length; index++) {
        crc = CRC8_LOOKUP[(crc ^ current[index]) & 0xff] & 0xff;
    }
    return crc;
}
const inputData = Buffer.from(msg.payload, 'hex')

msg.payload = crc8(inputData)

return msg

Proof...
image

steve, thank you so, so much! Solved a big problem for me! This forum is so honored to have you!

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.