# Help on CRC-8 function

**URL:** https://discourse.nodered.org/t/help-on-crc-8-function/34354
**Category:** Developing Nodes
**Created:** [16 October 2020 15:14 UTC](https://discourse.nodered.org/t/help-on-crc-8-function/34354 "2020-10-16T15:14:07Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### Author: ![ej3359](https://avatars.discourse-cdn.com/v4/letter/e/e47c2d/32.png) [@ej3359](https://discourse.nodered.org/u/ej3359)
#### Post date: [16 October 2020 15:14 UTC](https://discourse.nodered.org/t/help-on-crc-8-function/34354/1 "2020-10-16T15:14:07Z")

</div>

Hello,

I'm newbie on Node-Red.

I would like to interface my Texecom panel with Node Red with the Texecom Connect Protocol (in TCP/IP).  
In this purpose, i need create a CRC-8 function

I have the CRC function but in C language:

 ![CRC-Clanguage](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/c/3/c3c14d8dde1477ddfad3d736206f8791a8c9d6b1.png)

I have translate in Red Node function but i have bad CRC calculation:

My function:

var crc= 0x85;  
var poly= 0xFF;  
var i;  
var j;  
var buff= new Buffer(msg.payload);

for (let i=0; i \< buff.length; i++) {  
crc^=buff.readUInt8(i); [//msg.payload](https://msg.payload)[i];  
for (let j=0; j \< 8; j++) {  
if ((crc & 0x80)==0x80) {  
crc =((crc\<\<1)^poly);  
}  
else  
{  
crc = (crc\<\<1);  
}  
}  
}

msg.crc = crc;  
return msg;

May you help me?

---

<div class="post-metadata">

### Author: ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)
#### Post date: [16 October 2020 15:41 UTC](https://discourse.nodered.org/t/help-on-crc-8-function/34354/2 "2020-10-16T15:41:21Z")

</div>

Since there is no byte (or 8bit) number type, try anding all shifts and calcs with 0xff.

If you can provide sample data (the value of payload) and an expected CRC value, I'll show you how.

---

<div class="post-metadata">

### Author: ![ej3359](https://avatars.discourse-cdn.com/v4/letter/e/e47c2d/32.png) [@ej3359](https://discourse.nodered.org/u/ej3359)
#### Post date: [16 October 2020 16:18 UTC](https://discourse.nodered.org/t/help-on-crc-8-function/34354/3 "2020-10-16T16:18:53Z")

</div>

I have payload but no example of CRC. The only information is the function in C Language ☹

---

<div class="post-metadata">

### Author: ![ej3359](https://avatars.discourse-cdn.com/v4/letter/e/e47c2d/32.png) [@ej3359](https://discourse.nodered.org/u/ej3359)
#### Post date: [16 October 2020 16:22 UTC](https://discourse.nodered.org/t/help-on-crc-8-function/34354/4 "2020-10-16T16:22:49Z")

</div>

i have found this: [https://npm.io/package/texecom-connect/v/0.1.7](https://npm.io/package/texecom-connect/v/0.1.7)

---

<div class="post-metadata">

### Author: ![ej3359](https://avatars.discourse-cdn.com/v4/letter/e/e47c2d/32.png) [@ej3359](https://discourse.nodered.org/u/ej3359)
#### Post date: [16 October 2020 16:44 UTC](https://discourse.nodered.org/t/help-on-crc-8-function/34354/5 "2020-10-16T16:44:22Z")

</div>

i have copied the response of the texecom panel:  
0x74 x052 0x7 0x2 0x3 0x15 0xd2  
0xd2 is the CRC

---

<div class="post-metadata">

### Author: ![ej3359](https://avatars.discourse-cdn.com/v4/letter/e/e47c2d/32.png) [@ej3359](https://discourse.nodered.org/u/ej3359)
#### Post date: [16 October 2020 18:51 UTC](https://discourse.nodered.org/t/help-on-crc-8-function/34354/6 "2020-10-16T18:51:52Z")

</div>

I have found with this site

> **[Sunshine's Homepage - Online CRC Calculator Javascript](http://www.sunshine2k.de/coding/javascript/crc/crc_js.html)**

  
i choose:  
custom CRC-8  
Polynomial: 0x85  
Initial Value: 0xFF  
Final Xor Value: 0x00  
Input reflected:no  
Result reflected: :no

I have also found this function (CHECKSUM\_TABLE is an extract of the result on the site [http://www.sunshine2k.de/coding/javascript/crc/crc\_js.html](http://www.sunshine2k.de/coding/javascript/crc/crc_js.html)):  
But the result is 0xC5. I think that I need to modify the Initial Value (0xFF), but i don't know where?

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

return msg;

```

---

<div class="post-metadata">

### Author: ![edje11](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/edje11/32/572_2.png) [@edje11](https://discourse.nodered.org/u/edje11)
#### Post date: [16 October 2020 20:23 UTC](https://discourse.nodered.org/t/help-on-crc-8-function/34354/7 "2020-10-16T20:23:57Z")

</div>

> [@ej3359](#):
>
> var crc= 0x85;  
> var poly= 0xFF;

That's the other way around then in the C code.

Just my 2 cents.

---

<div class="post-metadata">

### Author: ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)
#### Post date: [16 October 2020 21:54 UTC](https://discourse.nodered.org/t/help-on-crc-8-function/34354/8 "2020-10-16T21:54:39Z")

</div>

> [@ej3359](#):
>
> 0x74 x052 0x7 0x2 0x3 0x15 0xd2

Thats not a valid value i'm afraid

This would be much easier if you could capture a few packets and the CRCs

---

<div class="post-metadata">

### Author: ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)
#### Post date: [17 October 2020 11:22 UTC](https://discourse.nodered.org/t/help-on-crc-8-function/34354/9 "2020-10-17T11:22:47Z")

</div>

> [@ej3359](#):
>
> 0x74 x052 0x7 0x2 0x3 0x15 0xd2  
> 0xd2 is the CRC

Assuming you meant `0x74 0x52 0x07 0x02 0x03 0x15 0xd2` has a CRC of `0xd2` then even that C code doesnt give `0xd2`

Assuming you meant `0x74 0x52 0x07 0x02 0x03 0x15` has a CRC of `0xd2` then even that C code doesnt give `0xd2` - you get `67` (or `0x43`)

C version...  
 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/3/1/31e975bf7a23adcbae1181435e05f956d0ba4f5e.png)  
Click [here](https://repl.it/@StephenMcLaughl/crc8) to see it in action

Additionally, my interpretation of that c code in JS function results in the same CRC

 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/f/5/f526690c2ad8c1f5d7afec5a91e6be16b7acc4c4.png)

```auto
[{"id":"aa6441fb.6f381","type":"function","z":"56a2925d.72edac","name":"Calc CRC","func":"var crc= 0x85;\nvar poly= 0xFF;\n\nvar buf= msg.payload;\n\nfor (let i=0; i < buf.length; i++) {\n crc = (crc ^ (buf.readUInt8(i) & 0xff)) & 0xff\n for (let j=0; j < 8; j++) {\n if ((crc & 0x80)==0x80) {\n crc = ( ((crc<<1) & 0xff) ^ poly) & 0xff;\n } else {\n crc = ((crc & 0xff) << 1) & 0xff;\n }\n }\n}\n\nmsg.crc = crc;\nmsg.crchex = crc.toString(16);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":900,"y":200,"wires":[["9cd60bb9.e21668"]]},{"id":"9d48507f.9343c","type":"inject","z":"56a2925d.72edac","name":"as hex string 745207020315","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"hex string 745207020315","payload":"745207020315","payloadType":"str","x":620,"y":140,"wires":[["1bf1e4.0d454e1d"]]},{"id":"1bf1e4.0d454e1d","type":"function","z":"56a2925d.72edac","name":"to buffer","func":"msg.payload = Buffer.from(msg.payload,\"hex\")\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":880,"y":140,"wires":[["aa6441fb.6f381"]]},{"id":"9cd60bb9.e21668","type":"debug","z":"56a2925d.72edac","name":"crc","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"true","targetType":"full","statusVal":"crc","statusType":"msg","x":1050,"y":200,"wires":[]},{"id":"6634df59.7895f","type":"inject","z":"56a2925d.72edac","name":"as buffer [116 ,82 ,7 ,2 ,3 ,21]","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"buffer [116 ,82 ,7 ,2 ,3 ,21]","payload":"[116 ,82 ,7 ,2 ,3 ,21]","payloadType":"bin","x":620,"y":240,"wires":[["aa6441fb.6f381"]]},{"id":"ac80a6c.4707958","type":"inject","z":"56a2925d.72edac","name":"as hex string 745207020315d2","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"hex string 745207020315d2","payload":"745207020315d2","payloadType":"str","x":630,"y":100,"wires":[["1bf1e4.0d454e1d"]]},{"id":"f03c1bd1.83ecb8","type":"inject","z":"56a2925d.72edac","name":"as buffer [116 ,82 ,7 ,2 ,3 ,21 ,210]","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"buffer [116 ,82 ,7 ,2 ,3 ,21 ,210]","payload":"[116 ,82 ,7 ,2 ,3 ,21, 210]","payloadType":"bin","x":640,"y":200,"wires":[["aa6441fb.6f381"]]}]

```

---

<div class="post-metadata">

### Author: ![ej3359](https://avatars.discourse-cdn.com/v4/letter/e/e47c2d/32.png) [@ej3359](https://discourse.nodered.org/u/ej3359)
#### Post date: [25 October 2020 17:54 UTC](https://discourse.nodered.org/t/help-on-crc-8-function/34354/10 "2020-10-25T17:54:45Z")

</div>

Thanks for all, that's run 🙂

my function:

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

```

---

<div class="post-metadata">

### Author: ![system](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/1X/d073cd938eafa2e558d7c2cd59003b3ef4963033.png) [@system](https://discourse.nodered.org/u/system)
#### Post date: [8 November 2020 17:54 UTC](https://discourse.nodered.org/t/help-on-crc-8-function/34354/11 "2020-11-08T17:54:49Z")

</div>

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