簡體   English   中英

如何將文字字符十六進制值轉換為十六進制值本身?

[英]How to convert literal char hex value into the hex value itself?

我有一個應該存儲在unsigned char[64]數組中的文字值。 如何將這些值轉換為十六進制等效值?

int main() {

    unsigned char arry[1] = { 0xaa }

    char* str = "fe"; //I want to store 0xfe on arry[0]

    arry[0] = 0xfe; // this works, but I have to type it
    arry[0] = 0x + str; //obviously fails

    return 0;
}

有什么指針嗎?

arr[0] = strtol(str,NULL,16);  // If one entry is big enough to hold it.

對於每個字符c ,值為:

 if ('0' <= c && c <= '9') return c - '0';
 if ('a' <= c && c <= 'f') return c - 'a' + 10;
 if ('A' <= c && c <= 'F') return c - 'A' + 10;

 // else error, invalid digit character

現在只需從左到右迭代字符串,將數字值相加,然后每次將結果乘以16。

(這是由基礎16的strto*l函數中的標准庫實現的。)

使用函數strtol()將字符串轉換為特定基數中的long: http//www.cplusplus.com/reference/cstdlib/strtol/

“解析C-string str將其內容解釋為指定基數的整數,該數據作為long int值返回。如果endptr不是空指針,則該函數還將endptr的值設置為指向第一個字符在號碼之后。“

例:

#include <stdio.h>      /* printf */
#include <stdlib.h>     /* strtol */

int main ()
{
  char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";
  char * pEnd;
  long int li1, li2, li3, li4;
  li1 = strtol (szNumbers,&pEnd,10);
  li2 = strtol (pEnd,&pEnd,16);
  li3 = strtol (pEnd,&pEnd,2);
  li4 = strtol (pEnd,NULL,0);
  printf ("The decimal equivalents are: %ld, %ld, %ld and %ld.\n", li1, li2, li3, li4);
  return 0;
}

將任意長度的解決方案放在一起。
可悲的是,字符串到X是冗長的:討厭處理非十六進制字符串,奇數長度,太大等。

#include <string.h>
#include <stdio.h>

// S assumed to be long enough.
// X is little endian
void BigXToString(const unsigned char *X, size_t Length, char *S) {
  size_t i;
  for (i = Length; i-- > 0; ) {
    sprintf(S, "%02X", X[i]);
    S += 2;
  }
}

int BigStringToX(const char *S, unsigned char X[], size_t Length) {
  size_t i;
  size_t ls = strlen(S);
  if (ls > (Length * 2)) {
    return 1;  //fail, too big
  }
  int flag = ls & 1;
  size_t Unused = Length - (ls/2) - flag;
  memset(&X[Length - Unused], 0, Unused);  // 0 fill unused
  char little[3];
  little[2] = '\0';
  for (i = Length - Unused; i-- > 0;) {
    little[0] = *S++;
    little[1] = flag ? '\0' : *S++;
    flag = 0;
    char *endptr;
    X[i] = (unsigned char) strtol(little, &endptr, 16);
    if (*endptr) return 1;   // non-hex found
    if (*S == '\0') break;
  }
  return 0;
}

int main() {
  unsigned char X[64];
  char S[64 * 2 + 2];
  char T[64 * 2 + 2];
  strcpy(S, "12345");
  BigStringToX(S, X, sizeof(X));
  BigXToString(X, sizeof(X), T);
  printf("'%s'\n", T);
  return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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