2017-12-22 59 views
0

새로운 큰 프로젝트를 시작하기 때문에 CRC (Cyclic Redundancy Check)에 대해 배우기 시작했습니다. 나는 그것에 대해 배웠다. (CRC-16, 다항식 x^16 + x^15 + x^2 + 1, 16 진수 0x8005와 같음). 그러나 내가 잘했는지 확인했을 때, 그것을 찾았지만 대답을 얻지 못했습니다. 웹 사이트를 사용하고 있습니다 : http://crccalc.com/ 코드에서 이진 값 0100010101010011 (0x4553과 동일)을 입력하고 결과는 1001111111101100 (0x9FEC와 동일합니다)입니다. 웹 사이트에서 올바른 결과를 찾았지만 그렇지 않습니다. 내가 기대했던 것 (나는 0xAD72을 얻을 것이라고 생각했다).파이썬에서 CRC-16을 계산하려고 시도했습니다.

나는 두 가지 질문이 있습니다

  1. 내가 CRC-16/ARC하지 CRC-16/BUYPASS을 지원하는 코드를 변경하려면 어떻게합니까?

  2. 왜 다항식 x^16 + x^15 + x^2 + 1이 0x8005가 아니라 0xC005가 아닌지? 감사합니다.

내 파이썬 코드 :

def stXor(a,b): 
    if(a==b): 
     return "0" 
    else: 
     return "1" 

def stshl(str1,shift): 
    temp="" 
    temp=str1 
    for i in range(shift): 
     temp=temp[1:] 
    return temp 

def get_error(data,padding=True): 
    good=data 
    lst=["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"] 
    if(padding): 
     good=data+"0"*16 
    now="0" 

    while len(good)>0: 

     now=lst[0] 
     lst[0]= stXor(lst[1],now) #x^15 
     lst[1]=lst[2] 
     lst[2]=lst[3] 
     lst[3]=lst[4] 
     lst[4]=lst[5] 
     lst[5]=lst[6] 
     lst[6]=lst[7] 
     lst[7]=lst[8] 
     lst[8]=lst[9] 
     lst[9]=lst[10] 
     lst[10]=lst[11] 
     lst[11]=lst[12] 
     lst[12]=lst[13] 
     lst[13]=stXor(lst[14],now)# x^2 
     lst[14]=lst[15] 
     lst[15]=stXor(good[0],now) 
     good=stshl(good,1) 


    a="" 
    for letter in lst: 
     a+=letter 


    return a 


data="0100010101010011" 

print("data entered: "+"\nhex: "+str(hex(int(data, 2)))+"\nBinary: "+data) 


a=get_error(data) 
print("Result: "+"\nhex: "+str(hex(int(a, 2)))+"\nBinary: "+a) 

인쇄 출력 :

데이터 입력 :

진수 : 0x4553

진 : 0100010101010011

결과 :

진수 : 0x9fec

진 : 1001111111101100

+0

'0xC003'은 어디에서 왔습니까? –

+0

죄송합니다. 나는 그것을 0xC005로 고쳤다 –

+0

좋아, 그럼'0xC005'는 어디에서 왔는가? –

답변

0

왜 CRC-16를 계산하는 데 사용할 수있는 라이브러리 중 하나를 사용하지? 예 : https://pypi.python.org/pypi/crc16/0.1.1

+1

으로 알고 싶습니다. 어떻게 작동하는지 알고 싶습니다. 다른 languge에서 그것을 만들 필요가있다 –

2

CRC-16/BUYPASS와 비교하여 CRC-16/ARC가 계산에서 비트를 반전시킵니다. 그것은 둘 사이의 유일한 차이점입니다. 따라서 레지스터와 입력 비트를 반대로 바꾸십시오.

X 16 + X15가 1로 설정 지수의 위치 이진 표현되는 2 +1 + X 때문에 11000000000000101 또는 0x18005. 계산에서 가장 높은 출력은 CRC (이 경우 16)의 길이를 정의하며이 비트는 삭제되어 0x8005이됩니다.

CRC는 그런 식으로 구현되지 않습니다. CRC의 정의 방법과 구현 방법에 대해 알고 싶으면 Ross Williams' excellent tutorial on CRCs을 읽어보십시오. Greg Cook's catalog에 많은 CRC의 정의가 있습니다. crcany은 임의의 CRC에 대해 C 코드를 생성합니다.

+0

대단히 감사합니다. 당신의 대답은 제게 많은 도움이됩니다! –