2017-01-05 5 views
1

私は16b crcを計算しなければなりません。スタックオーバー。 crc on python

それは私がデータのフォーマット

data = "01190026032700169798001100000358057900002893" 

CRCをHexデータは、このです:

crc = "b83a" 

このCRCがこれらの機能

unsigned short CRC(unsigned char *s, int len, unsigned 
short crcval) 
{ 
register unsigned c,q; 
for (; len; len--) 
{ 
c = *s++; 
q = (crcval^c) & 017; 
crcval = (crcval >> 4)^(q * 010201); 
q = (crcval^(c >> 4)) & 017; 
crcval = (crcval >> 4)^(q * 010201); 
} 
return (crcval); 
} 

uint16_t sas_crc_add_byte(uint16_t crc, uint8_t b) 
{ 
    uint16_t q = (crc^b) & 017; 
    crc = (crc >> 4)^(q * 010201); 
    q = (crc^(b >> 4)) & 017; 
    crc = (crc >> 4)^(q * 010201); 
    return crc; 
} 
で計算しています

OK私はそのようなことを試みます。しかし、結果は異なります。

def crc(b, seed=0): 
    for x in b: 
     q = (seed^int(x, 16)) & 0o17 
     seed = (seed >> 4)^(q * 0o10201) 
     q = (seed^(int(x, 16) >> 4)) & 0o17 
     seed = (seed >> 4)^(q * 0o10201) 
    return hex(seed) 
+0

を行って。 1つの問題は、半角数字で16進数を反復処理していることです。私は、文字列をチャンクしようとし、それを反復して、私は間違った順序で正しいバイトである "3AB8"で終わった。 – mwchase

+0

私はこれを試しました。 そして私は同じ結果になった –

+0

あなたはこの結果をどのように得たのですか?私は "3ab7"を得るコードは私にすべてのデータのための同じ結果を与える場合 私はちょうど反転することができます –

答えて

0

は、私は完全な解決策を持っていない

def crc(b, seed=0): 
    c = '' 
    for x in b: 
     c = c + x 
     if len(c) == 2: 
      q = (seed^int(c, 16)) & 0o17 
      seed = (seed >> 4)^(q * 0o010201) 
      q = (seed^(int(c, 16) >> 4)) & 0o17 
      seed = (seed >> 4)^(q * 0o010201) 
      c='' 
    data = hex(seed) 
    data = data[4:] + data[2:-2] 
    return data