[英]Best way to convert unsigned char * to int?
您好,我有一個unsigned char *
,看起來(在printf之后)是這樣的(這是SHA-1哈希):
n\374\363\327=\3103\231\361P'o]Db\251\360\316\203
我需要將這個unsigned char *
轉換為unsigned int
,您認為這是最好的方法嗎? 我有一些想法,但是我不是C專家,所以想在嘗試自己的東西之前先看看別人的想法。
好吧,這超過了4個字節,因此,如果您的系統將32位用於無符號int,那么您將無法做到這一點而不會潛在地丟失信息。 IOW,它將必須是某種形式的哈希。
為什么需要轉換? 這是一個160位長的摘要。 摘要僅以兩種方式使用:
您用類似的內容打印摘要
for (i = 0; i < 20; ++i) {
printf("%2x", digest[i]);
}
並與另一個摘要進行比較
for (i = 0, equals = 1; i < 20; ++i) {
if (a[i] != b[i]) {
equals = 0;
}
}
它就像一個20字節長的字節數組一樣,工作得很好。 您不必擔心字節序,字長或其他問題。
這是160位,因此很難放入單個unsigned int中。 但是,一定可以將它放入無符號int數組中。
像這樣的東西(丑陋,對機器體系結構作了一些假設,可能應該使用CHAR_BITS和其他一些東西在編譯時具有正確的常量,但是作為概念證明就足夠了):
unsigned int (*convert)(unsigned char *original) { unsigned int *rv = malloc(5*sizeof(unsigned int)); char *tp = original; for (rvix=0;rvix<5;rvix++) { rv[rvix] = *(tp++)<<24; rv[rvix] |= *(tp++)<<16; rv[rvix] |= *(tp++)<<8; rv[rvix] |= *(tp++); } return rv; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.