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

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

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

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

2714閲覧

C++ unsigned longの10進の値を16進に変換

退会済みユーザー

退会済みユーザー

総合スコア0

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/04/08 08:18

VisualStudio2015 VisualC++ Windows1064bit

表題の通りですが、
C++で unsigned longの10進の値を16進に変換するにはどうすればよいのでしょうか。

C++

1 // 10進数の取得データを16進数に変換 2 unsigned long value = 1612709888 3 int length = std::to_string(value).length(); 4 char* data = new char[length + 1]; 5 memcpy(data, std::to_string(value).c_str(), length + 1); 6 unsigned long longData = strtol(data, NULL, 16); 7

のように実装してみたのですが、全然期待した値(60200000)になりませんでした。

よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

cでの基数変換ですがbcnvに上げてあります。
・・・#define BITSIZ (sizeof(int) * CHAR_BIT)をint→longにすれば行けると思います。
・・・最後に反転してるのでみっともないですが^^; ヒントになれば・・・

投稿2019/04/08 10:20

cateye

総合スコア6851

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

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

0

ベストアンサー

やっていることが逆(数値→10進法の文字列→それを16進法として強引に解釈)のように思われます。

c++

1unsigned long value = 1612709888; 2char data[sizeof(unsigned long)* 2 + 1] = ""; 3std::sprintf(data, "%lx", value);

paiza.ioでの実行結果

(もっとC++っぽい書き方は、他の方におまかせします)

streamを使って書き直し(paiza.io

C++

1 unsigned long value = 1612709888; 2 std::ostringstream ss; 3 ss << std::hex << value; 4 std::cout << ss.str() << std::endl;

投稿2019/04/08 08:28

編集2019/04/08 08:35
maisumakun

総合スコア145121

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

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

退会済みユーザー

退会済みユーザー

2019/04/09 01:57

回答ありがとうございます。 2つ解法をいただいていますが、上の方法で最後のdataをunsinged longに入れるにはどうすればよいのでしょうか。
maisumakun

2019/04/09 01:59

入れられません(16進法化した結果は「a1b2c3」のように文字が入ることもありますので、整数に代入しては意味がありません)。
maisumakun

2019/04/09 02:00

というより、「16進法化した値を改めて10進法の整数と解釈してunsigned longに代入する」という行為自体、(他のライブラリの都合で余儀なくされる場合を除けば)設計が間違っています。
退会済みユーザー

退会済みユーザー

2019/04/09 02:03

確かにそうですね。 ありがとうございます。 もう少し設計を考えてみます。
guest

0

sprintf(data,"%lX",value);

あ、これじゃだめだ

char data[9]; // もっと大きくしよう
sprintf(data,"%lX",value);

投稿2019/04/08 08:24

編集2019/04/08 08:26
y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問