2010-12-28 3 views
0

誰かこのコードをPythonに翻訳していただけますか?私が試したし、もう一度試してみましたが、それを管理していないていますcrc24をcから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

ありません私たちは、についてですあなた – Falmarri

+0

ためのコードを書きませんこれまでに翻訳する最も簡単で素敵なコード。 – Falmarri

+0

Pythonのバージョンで何が問題でしたか? Pythonであなたの試行を投稿してください。多分、誰かがここからあなたのミスを修正することができます。 – pafcu

答えて

1

(Iは、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 
2
# 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 
+0

oohhhhh ....ありがとう!私は単純にシフトするのではなく、回転のために '' 'を間違えたと信じていません。これをやってくれてありがとう。私は答えとしてこれをチェックしますが、まだメンバーではありません – biiiiiaw

+0

それは私のバージョンよりもはるかに論理的に書かれているので、かなり正しかったが、私は今それと一緒に暮らすだろう – biiiiiaw

+1

@biiiiiaw:どうですかあまり正しくない?あなたが問題に気づいて、それについて書く時間があれば、あなたは実際の問題が何であるかを伝えるかもしれません。たとえ "それと一緒に暮らす"ことができたとしても、誰かが知っておくと便利かもしれません。 – pafcu

関連する問題