「0x1800785」などの値を含む char[] がありますが、値を与える関数には int が必要です。これを int に変換するにはどうすればよいですか? 私は周りを検索しましたが、答えが見つかりません。ありがとう。
14 に答える
試しました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 などの明示的なベースを指定することも可能ですが、冗長性を導入することはお勧めしません。)
このようなものが役に立つかもしれません:
char str[] = "0x1800785";
int num;
sscanf(str, "%x", &num);
printf("0x%x %i\n", num, num);
読み取りマン sscanf
それが文字列であると仮定すると、strtolはどうですか?
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 も追加します。
以下のコードブロックを試してみてください。
char p[] = "0x820";
uint16_t intVal;
sscanf(p, "%x", &intVal);
printf("value x: %x - %d", intVal, intVal);
出力は次のとおりです。
value x: 820 - 2080
私は同様のことをしました。実際に私のために働いているのを助けるかもしれないと思います
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進値を与えることができるようにしたい場合は、それを必要としなかったため、それを行っていません。
を使用せずに16進数/10進数変換を行うライブラリを作成しましたstdio.h
。使い方はとても簡単です:
unsigned hexdec (const char *hex, const int s_hex);
最初の変換の前に、変換に使用される配列を次のように初期化します。
void init_hexdec ();
github のリンク: https://github.com/kevmuret/libhex/