2017-09-12 25 views
0

다음은 제 16 진수 문자열자바 코드

String str="01312D0102D6010162000600000918000000000000000000000000007FFF00150010004B0100003A200207000004040055516200050E9E000200000000005852324531533156304330000001614B00541E0C07110507320000000000000000000000000500000000000000000406000030313030313033300000000000000000000046300A1D1655000186A0FFFF9EAA00000043000000000200000C000C000C000C000D000C000D000C000D000C000D000D000C000C000C000C000D000C000D000D000C000D000D000C000D000D000C000D000D000D000C000D000D000D000E000D000C000D000D000D000D000C000D000D000D000E000D000D000D000C000D000D029E029F02F102EA05300544085A07C1060F040A036404E0072F064804AA040404070510066B067205C304B302C6000D000D000D000E000D000D000E000D000E000D000D000E000D000D000E000D000E000D000E000D000E000D000D0065006300810081025102E001990082001F000E000D000E000D000E000E000D000E000D000E000E001500560062003300480068009000AF00AE00AE0214048404670560007E000E000E000E000E000E000F000E000E000E000E000E005501290168000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000D000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000D000E000D000E000D000E000D000E000E000D000E000D000D000D000D000D000C000D000D000E000D000D000D000D000D000D000D000E000D000D000E000D000D000E000D000D000D000D000D00E200DF00DF000F000E000D007300DF"; 

이며,이 내 CRC이다 : 위의 문자열에 추가됩니다 A228. I 출력 A228 등

다항식 사용이

누군가가 나에게 CRC16를 계산하는 코드를 제공 할 수

다음

이 내 자바 코드

String str="01312D0102D6010162000600000918000000000000000000000000007FFF00150010004B0100003A200207000004040055516200050E9E000200000000005852324531533156304330000001614B00541E0C07110507320000000000000000000000000500000000000000000406000030313030313033300000000000000000000046300A1D1655000186A0FFFF9EAA00000043000000000200000C000C000C000C000D000C000D000C000D000C000D000D000C000C000C000C000D000C000D000D000C000D000D000C000D000D000C000D000D000D000C000D000D000D000E000D000C000D000D000D000D000C000D000D000D000E000D000D000D000C000D000D029E029F02F102EA05300544085A07C1060F040A036404E0072F064804AA040404070510066B067205C304B302C6000D000D000D000E000D000D000E000D000E000D000D000E000D000D000E000D000E000D000E000D000E000D000D0065006300810081025102E001990082001F000E000D000E000D000E000E000D000E000D000E000E001500560062003300480068009000AF00AE00AE0214048404670560007E000E000E000E000E000E000F000E000E000E000E000E005501290168000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000D000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000D000E000D000E000D000E000D000E000E000D000E000D000D000D000D000D000C000D000D000E000D000D000D000D000D000D000D000E000D000D000E000D000D000E000D000D000D000D000D00E200DF00DF000F000E000D007300DF";//A228"; 

    byte arr[] = toByteArray(str); 


     long polynomial = 0xA001; 
     long CRC = 0xFFFF; 

     for (byte b : arr) 
     { 
      CRC ^= b; 
      for (int i = 8; i != 0; i--) 
      { 
       if ((CRC & 0x0001) != 0) 
       { 
        CRC = (CRC >> 1)^polynomial; 
       } 
       else 
       { 
        CRC >>= 1; 
       } 
      } 
     } 



     System.out.println(CRC); 

}

0xA001

이다 싶어

출력이 -56289로 표시됩니다.

+0

이것은 StackOverflow가 작동하는 방식이 아닙니다. 너 뭐 해봤 니? 구글'crc16 java'을 해 보셨습니까? – OptimusCrime

+0

물론 그렇습니다! – Fazaikh

+0

이 예제는 어떻게됩니까? https://stackoverflow.com/a/13209435/921563 – OptimusCrime

답변

2

올바른 데이터를 입력하고 결과 CRC를 올바르게 표시해야한다는 점을 제외하고 코드는 대부분 괜찮으며 아래 메시지와 함께 해당 메시지에 대해 0xa228을 생성합니다 (아래 수정 포함).

올바른 데이터를 입력하려면 먼저 해당 16 진수 문자열을 많은 이진수 바이트의 절반으로 변환해야합니다. CRC 루틴에 을 부여하면이됩니다.

둘째, 십진수가 아닌 16 진수로 결과를 표시하십시오.

세 번째로 byte에 서명되어 있으므로 부호 확장을 피하기 위해 CRC ^= b & 0xff;을 사용하십시오.

+0

문자열을 바이트 배열로 변환 중입니다. 또한 16 진수로 인쇄하고 여전히 출력을 얻는 중입니다 : ffffffffffff3637 – Fazaikh

+0

제 대답을 더 자세히 읽으십시오. _hexadecimal_을 바이트로 변환해야합니다. 1460 문자는 1430 바이트가 아닌 730 바이트가됩니다. –

+0

또한 자바에서 부호있는 바이트 문제를 해결해야한다는 것을 알게되었습니다. –