2011-04-07 55 views
0

我有一個20字節的無符號字符test_SHA1 [20],它是散列函數的返回值。用下面的代碼,我得到如下的輸出來自安全散列函數的無符號字符的模型

unsigned char test_SHA1[20]; 
char hex_output[41]; 
for(int di = 0; di < 20; di++) 
{ 
    sprintf(hex_output + di*2, "%02x", test_SHA1[di]); 
} 

printf("SHA1 = %s\n", hex_output); 

50b9e78177f37e3c747f67abcc8af36a44f218f5

這個號碼的最後9位是0x0f5(= 245十進制),我將通過採取test_SHA1的模512得到。要採取test_SHA1的模512,我做

int x = (unsigned int)test_SHA1 % 512; 
printf("x = %d\n", x); 

但X原來是158而不是245

回答

1

我建議做逐位,並與到0x1FF,而不是使用%操作。

+0

謝謝。我試過「test_SHA1 = test_SHA1&0x1ff;」但它給我一個編譯錯誤。你能否發佈命令做按位AND並將其轉換爲十進制。 – Romonov 2011-04-07 18:55:34

+0

我剛剛意識到test_SHA1是一個數組(20循環,我假設你的循環)。假設它是一個char數組,你應該使用'(test_SHA1 [18]&1)+ test_SHA1 [19]'。或者,如果它是更寬的整數類型,則爲'test_SHA1 [19]&0x1ff'。這也解釋了前面的結果 - 你將一個數組指針(一個地址)投射到一個無符號的整數並取出地址的低9位。 – 2011-04-07 19:29:54

+0

我的錯誤。我應該添加test_SHA1的聲明。我編輯帖子添加它。 – Romonov 2011-04-07 19:40:28