2013-06-24 2 views
1

inChi 라이브러리 (여기에서 사용 가능 : http://www.iupac.org/home/publications/e-resources/inchi.html)의 부호없는 char을 long으로 캐스팅합니다. 이해하려고하는 SHA-2 알고리즘 (구현이 아닌 알고리즘)의 맞춤 구현이 있습니다. 코드의 특정 한 짧은 단편 정말 혼란 :SHA-2 알고리즘

이 매크로 이러한 맥락에서 사용된다
#define PUT_UINT32_BE(n,b,i)       \ 
{              \ 
    (b)[(i) ] = (unsigned char) ((n) >> 24);  \ 
    (b)[(i) + 1] = (unsigned char) ((n) >> 16);  \ 
    (b)[(i) + 2] = (unsigned char) ((n) >> 8);  \ 
    (b)[(i) + 3] = (unsigned char) ((n)  );  \ 
} 
#endif 

:

unsigned long total[2];  /*!< number of bytes processed */ 
:

unsigned char msglen[8]; 
low = (ctx->total[0] << 3); 
PUT_UINT32_BE(low, msglen, 4); 

문제가 총 long의 표로서 정의된다

이렇게 합계가 처리 된 바이트 수를 절약하면 total[0]이 256보다 클 수 있습니다. (이것이 아마로 정의 된 이유 일 것입니다)이 주조의 효과가 무엇인지 모르겠다. 에 unsigned charPUT_UINT32_BE 매크로가 있습니까? 그게 주먹 x 바이트 또는 마지막 바이트 또는 total[0] % 256받을까요?

+0

매크로를 더 자세히 읽습니다. 32 비트 값의 각 8 비트 구성 요소를 가져 와서 재정렬합니다. –

+0

오, 매크로에서 제공하는 컨텍스트에서 매크로가 어떻게 호출되는지 모르겠습니까? –

+0

@JoachimPileborg - 컨텍스트가 수정되었습니다. 내 경우에는 low = 904이므로 unsigned char에 904를 어떻게 캐스팅 할 수 있습니까? – mnowotka

답변

1

매크로는 일부 오프셋에서 시작하여 32 비트 값의 단일 8 비트 엔티티를 단순히 바이트 배열에 넣습니다. 첫 번째 쉬프트는 상위 8 비트 (비트 24에서 31)를 가져오고, 다음 쉬프트는 16에서 23 비트, 8 비트에서 15 비트, 마지막으로 비트 0에서 7을 얻습니다.

If 당신은 반대로, 즉 배열에서 바이트를 가져 와서 32 비트 값으로 결합하면 원래 값을 되 찾을 수 있습니다.

0

왜 간단한 메모리 dereferncing을 사용하지 않습니까? 예 :

* (int*) &(b[(i)] = n;