crc24 от c до питона - PullRequest
       9

crc24 от c до питона

0 голосов
/ 28 декабря 2010

Может кто-нибудь перевести этот код на Python?я попробовал и попробовал еще раз, но не справился:

  #define CRC24_INIT 0xB704CEL
  #define CRC24_POLY 0x1864CFBL

  typedef long crc24;
  crc24 crc_octets(unsigned char *octets, size_t len)
  {
      crc24 crc = CRC24_INIT;
      int i;
      while (len--) {
          crc ^= (*octets++) << 16;
          for (i = 0; i < 8; i++) {
              crc <<= 1;
              if (crc & 0x1000000)
                  crc ^= CRC24_POLY;
          }
      }
      return crc & 0xFFFFFFL;
  }

У меня есть функция поворота влево (ROL24(value,bits_to_rotate_by)), которая, как я знаю, работает, так как я получил ее из исходного кода авторитетного программиста, но я не получаю * и ++ на октете.я только отчасти понимаю, как ++ работает в c ++, и я вообще не знаю, что такое *

мой код:

def crc24(octets, length):# now octects is a binary string
 INIT = 0xB704CE
 POLY = 0x1864CFB
 crc = INIT
 index = 0
 while length:
  crc ^= (int(octets[index], 2) << 16)
  index += 1
  for i in xrange(8):
   crc = ROL(crc, 1)
   if crc & 0x1000000:
    crc ^= POLY
  length -= 1
 return crc & 0xFFFFFF

Ответы [ 2 ]

2 голосов
/ 28 декабря 2010
# Yes, there is no 'length' parameter here. We don't need it in Python.
def crc24(octets):
    INIT = 0xB704CE
    POLY = 0x1864CFB
    crc = INIT
    for octet in octets: # this is what the '*octets++' logic is effectively
    # accomplishing in the C code.
        crc ^= (octet << 16)
        # Throw that ROL function away, because the C code **doesn't** actually
        # rotate left; it shifts left. It happens to throw away any bits that are
        # shifted past the 32nd position, but that doesn't actulaly matter for
        # the correctness of the algorithm, because those bits can never "come back"
        # and we will mask off everything but the bottom 24 at the end anyway.
        for i in xrange(8):
            crc <<= 1
            if crc & 0x1000000: crc ^= POLY
    return crc & 0xFFFFFF
1 голос
/ 28 декабря 2010

Я не знаю Python, но unsigned char *octets - это указатель (вы можете думать о нем как о массиве размера len).

*octets возвращает первый элемент.

++ перемещает точку к следующему элементу.

, поэтому строка crc ^= (*octets++) << 16;

в основном совпадает с этим псевдокодом (индекс устанавливается равным 0 один раз).

(global var index = 0)

temp = octets[index] shift left 16 bits
crc = crc bitwise xor temp
index = index + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...