GithubHelp home page GithubHelp logo

Comments (10)

postmasters avatar postmasters commented on July 28, 2024 1

You could change the initialValue of that class to 0x1021, perhaps by subclassing? This is how it is currently defined.

class Crc16Xmodem extends ParametricCrc {
  Crc16Xmodem()
      : super(
          16,
          0x1021,
          0x0000,   // <--- initial value.
          0x0000,
          inputReflected: false,
          outputReflected: false);
}

from crclib.dart.

postmasters avatar postmasters commented on July 28, 2024

Perhaps Crc16CcittTrue is the right one? There are many Crc16 with polynomial of 0x1021. See https://reveng.sourceforge.io/crc-catalogue/16.htm. You may have to try each one of them until you find a match. I'm feeling lucky with that class though.

from crclib.dart.

guyluz11 avatar guyluz11 commented on July 28, 2024

Tested all and didn't find it

image
Did I missed something?.

from crclib.dart.

guyluz11 avatar guyluz11 commented on July 28, 2024

Source

binascii.crc_hqx(data, value)

Compute a 16-bit CRC value of data, starting with value as the initial CRC, and return the result. This uses the CRC-CCITT polynomial x16 + x12 + x5 + 1, often represented as 0x1021. This CRC is used in the binhex4 format.

I don't understand much about this, maybe it will help.

from crclib.dart.

postmasters avatar postmasters commented on July 28, 2024
>>> binary_packet = [254, 240, 82, 0, 2, 50, 161, 0, 0, 0, 0, 0, 52, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 187, 46, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 254, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> data = bytes(binary_packet)
>>> import binascii
>>> binascii.crc_hqx(data, 0)
16372

So looks like Crc16Xmodem is the one?

from crclib.dart.

guyluz11 avatar guyluz11 commented on July 28, 2024
>>> binary_packet = [254, 240, 82, 0, 2, 50, 161, 0, 0, 0, 0, 0, 52, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 187, 46, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 254, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> data = bytes(binary_packet)
>>> import binascii
>>> binascii.crc_hqx(data, 0)
16372

So looks like Crc16Xmodem is the one?

But it is not the same value as I gave

For example I give your binary_packet list in python

import binascii

binary_packet = [254, 240, 82, 0, 2, 50, 161, 0, 0, 0, 0, 0, 52, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 187, 46, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 254, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
result = binascii.crc_hqx(bytes(binary_packet), 0x1021)
print(result)

Result is equal to 58817

Same list in JavaScript

let TABLE = [
    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
    0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
    0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
    0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
    0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
    0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
    0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
    0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
    0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
    0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
    0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
    0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
    0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
    0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
    0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
    0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
    0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
    0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
    0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
    0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
    0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
    0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
  ];

  
const crc16ccitt = defineCrc('ccitt', function(buf, previous) {
    let crc = typeof previous !== 'undefined' ? ~~previous : 0xffff;
    for (let index = 0; index < buf.length; index++) {
        const byte = buf[index];
        crc = (TABLE[((crc >> 8) ^ byte) & 0xff] ^ (crc << 8)) & 0xffff;
    }

    return crc;
});


var binary_packet = [ 254, 240, 82, 0, 2, 50, 161, 0, 0, 0, 0, 0, 52, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 187, 46, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 254, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
result = crc16ccitt(binary_packet, 0x1021)
console.log(result)

Result is 58817

But in dart

import 'package:crclib/catalog.dart';
import 'package:crclib/crclib.dart';

class NoNullSafetyMethods {
  static int getCrc16CcittTrue(List<int> listOfNumbers) {
    CrcValue z = Crc16CcittTrue().convert(listOfNumbers);
    CrcValue r = Crc16Ccitt().convert(listOfNumbers);
    CrcValue n = Crc16A().convert(listOfNumbers);
    CrcValue o = Crc16Acorn().convert(listOfNumbers);
    CrcValue p = Crc16Arc().convert(listOfNumbers);
    CrcValue w = Crc16AugCcitt().convert(listOfNumbers);
    CrcValue x = Crc16CcittFalse().convert(listOfNumbers);
    CrcValue a = Crc16GeniBus().convert(listOfNumbers);
    CrcValue b = Crc16Gsm().convert(listOfNumbers);
    CrcValue c = Crc16Ibm3740().convert(listOfNumbers);
    CrcValue d = Crc16IbmSdlc().convert(listOfNumbers);
    CrcValue e = Crc16IsoIec144433A().convert(listOfNumbers);
    CrcValue f = Crc16Kermit().convert(listOfNumbers);
    CrcValue g = Crc16Mcrf4xx().convert(listOfNumbers);
    CrcValue h = Crc16Riello().convert(listOfNumbers);
    CrcValue j = Crc16SpiFujitsu().convert(listOfNumbers);
    CrcValue l = Crc16Tms37157().convert(listOfNumbers);
    CrcValue m = Crc16Xmodem().convert(listOfNumbers);

    return int.parse(c.toString());
  }
}

void main(List args) async {
  List<int> binary_packet  = [ 254, 240, 82, 0, 2, 50, 161, 0, 0, 0, 0, 0, 52, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 187, 46, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 254, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

  int a = NoNullSafetyMethods.getCrc16CcittTrue(binary_packet);
}

There is no line that translate this to 58817

image

Is there extra steps that I am missing?.
(I am using the nullsafety branch)

from crclib.dart.

guyluz11 avatar guyluz11 commented on July 28, 2024

I see now from your + my example that it is Crc16Xmodem/Crc16Acorn.

We are getting different results in python because you use 0 and I use 0x1021

binascii.crc_hqx(bytes(data), 0)

binascii.crc_hqx(bytes(binary_packet), 0x1021)

I am not sure what is the name of the second parameter in my JavaScript example it is called previous.
So in this package by default it is using 0, is there a way to change it?.

from crclib.dart.

guyluz11 avatar guyluz11 commented on July 28, 2024

Found it

If we change this to 0x1021 we get the 58817.

I can try to create pull request so that users will be able to change this value, tell me what you think.

from crclib.dart.

postmasters avatar postmasters commented on July 28, 2024

Normally initial values are either all 0s, or all 1s. For when you need a different initial value, subclassing ParametricCrc in your own code is more helpful, i.e. not meant for general population.

from crclib.dart.

guyluz11 avatar guyluz11 commented on July 28, 2024

I have extended ParametricCrc with the new value

import 'package:crclib/crclib.dart';

class Crc16XmodemWith0x1021 extends ParametricCrc {
  Crc16XmodemWith0x1021()
      : super(16, 0x1021, 0x1021, 0x0000,
            inputReflected: false, outputReflected: false);
}

And now it works.

Thanks for all the help and support.

from crclib.dart.

Related Issues (9)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.