2013-06-24 60 views
1

InChi庫(可在此處獲得:http://www.iupac.org/home/publications/e-resources/inchi.html)我試圖理解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 char msglen[8]; 
low = (ctx->total[0] << 3); 
PUT_UINT32_BE(low, msglen, 4); 

問題是,總定義爲long一個表:

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

所以現在,如果total保存處理的字節數,很有可能total[0]可能大於256(這可能是它被定義爲的原因),所以我不知道將這個long投射到PUT_UINT32_BE宏中的效果是unsigned char嗎?會得到第一個x字節或最後一個字節或total[0] % 256

+0

更仔細地閱讀宏...它需要32位值的每個8位分量並重新排列它們。 –

+0

哦,我沒有看到如何在你提供的上下文中調用宏? –

+0

@JoachimPileborg - 上下文現在已更正。在我的情況低= 904所以我怎麼能投904無符號字符? – mnowotka

回答

1

該宏只是將32位值的單個8位實體放入字節數組中,從某個偏移量開始。這是通過移位操作完成的:第一次移位得到前8位(位24至31),下一次移位得到位16至23,然後位8至15,最後位爲0至7.

如果你做相反的事情,即從數組中獲取字節並將它們放在一起作爲一個32位值,你將得到原始值。

0

爲什麼不使用簡單的內存延遲?例如:

* (int*) &(b[(i)] = n; 
相關問題