crc-16

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • eugene

    crc-16

    I looked for a crc-16(crc 16) function to use but couln't find one
    that worked:

    This one is working ..




    def crc16(s):
    crcValue=0x0000
    crc16tab = (0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280,
    0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481,
    0x0440, 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81,
    0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880,
    0xC841, 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81,
    0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80,
    0xDC41, 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680,
    0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081,
    0x1040, 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281,
    0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480,
    0xF441, 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80,
    0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881,
    0x3840, 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80,
    0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81,
    0x2C40, 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681,
    0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080,
    0xE041, 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281,
    0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480,
    0xA441, 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80,
    0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881,
    0x6840, 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80,
    0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81,
    0x7C40, 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681,
    0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080,
    0xB041, 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280,
    0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481,
    0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81,
    0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880,
    0x9841, 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81,
    0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80,
    0x8C41, 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680,
    0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081,
    0x4040)
    for ch in s:
    tmp=crcValue^(o rd(ch))
    crcValue=(crcVa lue>> 8)^crc16tab[(tmp & 0xff)]
    return crcValue
  • Peter Hansen

    #2
    Re: crc-16

    eugene wrote:[color=blue]
    >
    > I looked for a crc-16(crc 16) function to use but couln't find one
    > that worked:
    >
    > This one is working ..
    >
    > def crc16(s):[/color]
    [snip]


    Since eugene started the thread, I'll continue it by posting one that we've
    been using. It's likely not as fast (eugene's used a lookup table for some
    of the work) but it has the added benefit of allowing you to specify which
    mask value will be used, so it is more general. You also have to call it
    once for each byte of data rather than wait for all the data to be collected
    but sometimes that's more appropriate anyway.

    # 16-bit CRCs should detect 65535/65536 or 99.998% of all errors in
    # data blocks up to 4096 bytes
    MASK_CCITT = 0x1021 # CRC-CCITT mask (ISO 3309, used in X25, HDLC)
    MASK_CRC16 = 0xA001 # CRC16 mask (used in ARC files)

    #----------------------------------------------------------------------------
    # Calculate and return an incremental CRC value based on the current value
    # and the data bytes passed in as a string.
    #
    def updcrc(crc, data, mask=MASK_CRC16 ):

    # data_length = len(data)
    # unpackFormat = '%db' % data_length
    # unpackedData = struct.unpack(u npackFormat, data)

    for char in data:
    c = ord(char)
    c = c << 8

    for j in xrange(8):
    if (crc ^ c) & 0x8000:
    crc = (crc << 1) ^ mask
    else:
    crc = crc << 1
    c = c << 1

    return crc & 0xffff


    -Peter

    Comment

    • Thomas Heller

      #3
      Re: crc-16

      Peter Hansen <peter@engcorp. com> writes:
      [color=blue]
      > eugene wrote:[color=green]
      >>
      >> I looked for a crc-16(crc 16) function to use but couln't find one
      >> that worked:
      >>
      >> This one is working ..
      >>
      >> def crc16(s):[/color]
      > [snip]
      >
      >
      > Since eugene started the thread, I'll continue it by posting one that we've
      > been using.[/color]
      [code snipped]

      Since you didn't post the unit tests, the code seems incomplete.
      From a TDD kind of view, at least. I'm disappointed of you <wink>.

      Thomas

      Comment

      • Peter Hansen

        #4
        Re: crc-16

        Thomas Heller wrote:[color=blue]
        >
        > Peter Hansen <peter@engcorp. com> writes:[color=green]
        > > [code snipped][/color]
        >
        > Since you didn't post the unit tests, the code seems incomplete.
        > From a TDD kind of view, at least. I'm disappointed of you <wink>.[/color]

        It was developed in 2000, before the invention of TDD and before my group
        started doing XP or TDD, and by a co-op student at that. :-)

        -Peter

        Comment

        Working...