2017-11-29 74 views
0

다음은 16 진수 문자열입니다. 57 F1 0F 9A A8 B7 00 08 00B 19 10 00 00 00 00 11 0 B 15 00 00 00 00 00 00 00 00 00 00 00 00 00 0016 진수 문자열의 체크섬

는 A8과 B7 내가 그것을 그런 식으로 계산 C에서

을 계산해야 체크섬 (100 % 일) :

void ByteStream_ComputeCS(void) 
{ 
     int i; 
     DWORD cs = 0; 
     for (i = 0; i < ByteStream[2] + 3; i++) 
     { 
       if (i != 2) cs += *((WORD*)ByteStream + i); 
     } 
     cs = (cs & 0xFFFF) + (cs >> 16); 
     ByteStream[4] = (BYTE)cs; 
     ByteStream[5] = (BYTE)(cs >> 8); 
} 

임 그런 식으로 일을하려고 :

data = bytearray.fromhex('57 F1 0F 9A 00 00 00 08 0B 19 10 00 00 00 00 00 11 0B 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00') 

c_sum = sum(data) 

난 그냥 0으로 검사를 대체 - C 년은

if (i != 2) cs += *((WORD*)ByteStream + i); 

요약 해달라고하지만 난 0x25e를 얻을. 그리고 그것을 A8과 B7로 가져 가라. 내가 뭘 잘못하고있어?

+1

당신은 다른 일을하고 있습니다. C 코드는 체크섬이있는 단어를 건너 뛰고 데이터의 길이 값을 사용하여 단어의 1의 보수 합계 (아마도 16 비트 임)입니다. (IPv4 체크섬과 조금 비슷해 보입니다.) 파이썬 코드는 바이트의 합계입니다. 구조체 또는 배열 모듈을 살펴보아야합니다. 또한 DWORD, WORD 또는 BYTE가 무엇인지 정의하지 않았습니다. 예 :'hex (sum (array.array ('H', buffer (data))))' –

+0

내 실수와 문제를 찾았습니다 : 57 + F1 + 0F + 9A +를 합계했습니다. 그러나 57F1 + 데프 HexToByte (hexStr) : 0F9A + .... 상기 I 발견 해결하는 바이트에이 방법으로 16 진수 문자열을 변환하는 바이트 = []를 hexStr = '.join (hexStr.split ("")) 범위 (0, LEN (hexStr), 4)에 대한 I : bytes.append (INT (hexStr [I : I + 4, 16)) 복귀 바이트 후 합계. 그러나 다른 방법이 있습니까? –

답변

0

그래서 내가 57 + F1 + 0F + 9A + ..

방법처럼 그렇게 난 + 0F9A + ....하지만

data = bytearray.fromhex(....) 
c_sum = sum(data) 

으로 57F1 합계를 가지고 있음을 이해 그것을 해결하기 위해, 내가 발견 :

def HexToByte(hexStr): 

    bytes = [] 

    hexStr = ''.join(hexStr.split(" ")) 

    for i in range(0, len(hexStr), 4): 
     bytes.append(int(hexStr[i:i + 4], 16)) 

    return bytes 

그리고 나서 합계. 그리고 그 ok 그러나 다른 방법이 있습니까?

+0

16 비트 바이트가 있습니까? 그리고 어레이가하는 일을 보셨습니까? –