2017-01-18 8 views
0

내가 찾은 방법을 사용하는 이유는 C#으로 Adler32 알고리즘을 구현하고 나는 그것을 사용하고 싶습니다,하지만 난 코드의 일부가 이해가 안 :Adler32 체크섬 생성 - 비트 오른쪽 연산자 이동이

을 누군가가 나를 설명 할 수 :

1) 왜 SUM2가 이동하는 이유 SUM1 및 SUM2이

2) 을 초기화 할 때, 비트 연산자를 사용하는? 위키

Adler32 https://en.wikipedia.org/wiki/Adler-32

& 오퍼레이터의 설명 : (이진 AND 연산자 사본은 두 피연산자에 존재하는 경우, 결과로 비트)

private bool MakeForBuffer(byte[] bytesBuff, uint adlerCheckSum) 
    { 
     if (Object.Equals(bytesBuff, null)) 
     { 
      checksumValue = 0; 
      return false; 
     } 
     int nSize = bytesBuff.GetLength(0); 
     if (nSize == 0) 
     { 
      checksumValue = 0; 
      return false; 
     } 
     uint sum1 = adlerCheckSum & 0xFFFF; // 1) why bit operator is used? 
     uint sum2 = (adlerCheckSum >> 16) & 0xFFFF; // 2) why bit operator is used? , why is it shifted? 

     for (int i = 0; i < nSize; i++) 
     { 
      sum1 = (sum1 + bytesBuff[i]) % adlerBase; 
      sum2 = (sum1 + sum2) % adlerBase; 
     } 
     checksumValue = (sum2 << 16) + sum1; 
     return true; 
    } 

답변

3

1) 왜 비트 연산자가 사용됩니까?

& 0xFFFF 정도로 sum1 단순히 검사의 하위 16 개 비트를 0으로 체크섬의 높은 두 바이트를 설정한다.

2) 왜 비트 연산자가 사용됩니까? , 왜 그것이 바뀌 었습니까?

adlerCheckSum >> 16& 0xFFFF는 제 1 단계에서와 동일한 않는 하부 16 바이트까지 상위 16 바이트 시프트 - 그것은 0

adlerChecksum = 0x12345678 

adlerChecksum & 0xFFFF = 0x00005678 

adlerChecksum >> 16 = 0x????1234 
예 16 개 높은 비트를 설정

(C#에서는 0x000이어야하지만 다른 언어/컴파일러에서는 "주위에서 비트를 감싸는"0x56781234을 얻을 수 있습니다)

(adlerChecksum >> 16) & 0xFFFF = 0x000 이제는 0x1234이라고 확신 할 수 있습니다.이 단계는 C#에서는 불필요한 예방 조치 일뿐입니다.

adlerChecksum = 0x12345678 
sum1 =   0x00005678 
sum2 =   0x000

그 두 작업은 단순히 결합이 UInt16UInt32 체크섬을 분할합니다. adler32 태그 위키


:

애들러-32은 신장의 결과를 검증하기 위하여 ZLIB에 사용되는 고속 체크섬 알고리즘이다. 이것은 65521을 기준으로 두 개의 합계로 구성됩니다. s1 = 1 및 s2 = 0으로 시작한 다음 각 바이트 x에 대해 s1 = s1 + x, s2 = s2 + s1로 시작하십시오. 두 합계는 낮은 16 비트의 s1과 높은 16 비트의 s2로 32 비트 값으로 결합됩니다.