96

「0x1800785」などの値を含む char[] がありますが、値を与える関数には int が必要です。これを int に変換するにはどうすればよいですか? 私は周りを検索しましたが、答えが見つかりません。ありがとう。

4

14 に答える 14

234

試しましたstrtol()か?

strtol - 文字列を長整数に変換します

例:

const char *hexstring = "abcdef0";
int number = (int)strtol(hexstring, NULL, 16);

0x数値の文字列表現が接頭辞で始まる場合、基数として 0 を使用する必要があります。

const char *hexstring = "0xabcdef0";
int number = (int)strtol(hexstring, NULL, 0);

(16 などの明示的なベースを指定することも可能ですが、冗長性を導入することはお勧めしません。)

于 2012-04-14T19:01:19.713 に答える
25

このようなものが役に立つかもしれません:

char str[] = "0x1800785";
int num;

sscanf(str, "%x", &num);
printf("0x%x %i\n", num, num); 

読み取りマン sscanf

于 2012-04-14T19:14:20.403 に答える
11

それが文字列であると仮定すると、strtolはどうですか?

于 2012-04-14T19:01:20.567 に答える
10

strtol一番上の回答が示唆するように、libc が利用可能である場合に使用します。ただし、カスタムが好きな場合や、libc などを使用しないマイクロコントローラーを使用している場合は、複雑な分岐のないわずかに最適化されたバージョンが必要になる場合があります。

#include <inttypes.h>


/**
 * xtou64
 * Take a hex string and convert it to a 64bit number (max 16 hex digits).
 * The string must only contain digits and valid hex characters.
 */
uint64_t xtou64(const char *str)
{
    uint64_t res = 0;
    char c;

    while ((c = *str++)) {
        char v = (c & 0xF) + (c >> 6) | ((c >> 3) & 0x8);
        res = (res << 4) | (uint64_t) v;
    }

    return res;
} 

ビット シフトの魔法は次のように要約されます。最後の 4 ビットを使用しますが、それが非数字の場合は 9 も追加します。

于 2019-07-19T12:34:28.477 に答える
3

以下のコードブロックを試してみてください。

char p[] = "0x820";
uint16_t intVal;
sscanf(p, "%x", &intVal);

printf("value x: %x - %d", intVal, intVal);

出力は次のとおりです。

value x: 820 - 2080
于 2014-09-05T08:41:57.997 に答える
1

私は同様のことをしました。実際に私のために働いているのを助けるかもしれないと思います

int main(){
  int co[8];
  char ch[8];
  printf("please enter the string:");
  scanf("%s", ch);
  for (int i=0; i<=7; i++) {
     if ((ch[i]>='A') && (ch[i]<='F')) {
        co[i] = (unsigned int) ch[i]-'A'+10;
     } else if ((ch[i]>='0') && (ch[i]<='9')) {
        co[i] = (unsigned int) ch[i]-'0'+0;
  }
}

ここでは、8 文字の文字列のみを取得しています。「a」から「f」に同様のロジックを追加して、同等の16進値を与えることができるようにしたい場合は、それを必要としなかったため、それを行っていません。

于 2016-07-02T05:14:07.413 に答える
0

を使用せずに16進数/10進数変換を行うライブラリを作成しましたstdio.h。使い方はとても簡単です:

unsigned hexdec (const char *hex, const int s_hex);

最初の変換の前に、変換に使用される配列を次のように初期化します。

void init_hexdec ();

github のリンク: https://github.com/kevmuret/libhex/

于 2014-05-03T13:41:40.173 に答える