簡體   English   中英

將unsigned char *轉換為int的最佳方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM