質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

797閲覧

16進文字->数値の変換関数が存在するか

iFQ7Vj

総合スコア52

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2023/02/24 01:19

編集2023/02/24 02:03

実現したいこと

C言語標準に文字から16進への変換関数が存在するかを知りたい

前提

C言語標準に16進文字の判定isxdigitや、16進文字列から数値への変換strtol, sscanf等がありますが、下記のよう16進文字から数値への変換を行う関数は存在しますか。

C

1int toxdigit(int c) { 2 3 return '0' <= c && c <= '9'? c - '0': 4 'a' <= c && c <= 'f'? c - 'a' + 10: 5 'A' <= c && c <= 'F'? c - 'A' + 10: 0; 6} 7

補足情報(FW/ツールのバージョンなど)

g++ 10.2.1 (Debian 10.2.1-6)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2023/02/24 01:49

ところで、その toxdigit 関数の中身なのですが、最後の false term がありません。 'A' <= c && c <= 'F'? c - 'A' + 10 : c; とでもしておくとよいかと。
otn

2023/02/24 01:51 編集

お書きのコードは、「文字から16進への変換関数」じゃなくて「16進数文字から数値への変換関数」ですね。
jimbe

2023/02/24 02:01

まさか int の中身が 16 進数だったり 10 進数だったりで異なるモノとお考えでしょうか。
iFQ7Vj

2023/02/24 02:13 編集

> 最後の false term がありません。 > 「文字から16進への変換関数」じゃなくて「16進数文字から数値への変換関数」ですね。 ありがとうございます、修正しました。 > int の中身が 16 進数だったり 10 進数だったりで異なるモノとお考えでしょうか。 数値型の内部表現はすべて2進数ですね。16進文字から数値でした、すみません
guest

回答3

0

ベストアンサー

質問文のコードのようなものは、現在のC標準にはない気がします。
コードを減らしたいなら、strtol() を使えばいいのではないでしょうか。効率を求めるなら質問文にあるコードや、対応表を用意して使えばいいと思います。

c

1int toxdigit(int c) { 2 char buf[2] = {(char)c, 0}; 3 return (int)strtol(buf, NULL, 16); 4}

質問のタイトルのように文字やら数値を16進数文字列に変換するのは、snprintf() などでしょうか。

投稿2023/02/24 01:50

編集2023/02/24 02:03
int32_t

総合スコア20872

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iFQ7Vj

2023/02/24 02:34

回答ありがとうございます やはり標準にそのような関数は無かったですか... いくつか実装方法がありそうなので少し考えてみます
guest

0

16進文字列を int に変換するのではなく、
16進文字を int に変換するんですね。
標準関数にはありません。

文字コードが ASCII なら、次のように書けます。
int toxdigit(int c) { return (c>>6)*9+c & 15; }

toxdigit という名前は変ですが、そのままにしています。

投稿2023/02/24 02:08

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iFQ7Vj

2023/02/24 02:36 編集

ご回答ありがとうございます なるほど、c が数字, 文字で分岐して文字なら10-15の範囲にしてから下1桁を取る、かなり短く書けて良いですね。 toxdigit は ctypeのisxdigitから持ってきたのですが、どのような名前が好ましいのでしょうか
otn

2023/02/24 02:35

> toxdigit は ctypeのisxdigitから持ってきたのですが、どのような名前にすれば良いのでしょうか toxdigitを活かすなら、xdigittoint とか xdigit2intでしょうか。
iFQ7Vj

2023/02/24 02:45 編集

確かにtoxdigitだと16進数値への変換というような意味になってしまいますね ありがとうございます
guest

0

sscanf() 使うのもアリかと。

C

1#include <stdio.h> 2 3int main(){ 4 const char* str = "3CBA"; 5 int result; 6 sscanf(str, "%x", &result); 7 printf("%s -> %d (%x)\n", str, result, result); // 3CBA -> 15546 (3cba) 8 return 0; 9}

投稿2023/02/24 01:56

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iFQ7Vj

2023/02/24 02:29

回答ありがとうございます 変換したいのは文字列ではなく文字です、分かりにくくてすみませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問