0

unsigned char[64]配列に格納する必要があるリテラル値があります。そのような値を16進数に変換するにはどうすればよいですか?

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;
}

ポインタはありますか?

4

4 に答える 4

2
arr[0] = strtol(str,NULL,16);  // If one entry is big enough to hold it.
于 2013-08-15T19:44:30.217 に答える
0

との間の任意の長さの解をまとめます。
悲しいことに、X への文字列は冗長です。非 16 進文字列、奇数の長さ、大きすぎるなどを扱うのは面倒です。

#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;
}
于 2013-08-15T20:51:41.570 に答える
0

各文字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 を掛けます。

strto*l(これは、base 16の関数の標準ライブラリによって実装されています。)

于 2013-08-15T19:44:12.037 に答える
0

関数strtol()を使用して、文字列を特定の基数の long に変換します: http://www.cplusplus.com/reference/cstdlib/strtol/

"C 文字列 str を解析し、その内容を指定された基数の整数として解釈します。これは long int 値として返されます。endptr が null ポインターでない場合、関数は 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;
}
于 2013-08-15T19:48:54.747 に答える