2017-10-24 15 views
-5

は、私は次のようにカンマ区切りの16進文字列を印刷するように探しています:定義済みのintをカンマ区切りの16進文字列としてCで印刷する方法は?整数int型のx = 0を考えると

00,00,00,00 

すべてのヘルプははるかに高く評価されます。ありがとう。個人的な質問のためにStackOverflowを使用してあいまいな質問、初めて申し訳

--SOLVED--

。興味がある人々のために、私は仕事に見つけた方法:

int ciphersuite = 0; 

unsigned char cipherbuf[4]; 
size_t cipherbuf_size = 4; 
memcpy(cipherbuf, &ciphersuite, cipherbuf_size); 

dumpbuf("Ciphersuite value:", cipherbuf, cipherbuf_size); 
+0

16進文字列として印刷する予定はありますか? xの個々のバイトは?もしそうなら、それをリトルエンディアンまたはビッグエンディアンの順序で印刷したいですか?あなたの質問を明確にしようとしてください。また、あなたの問題を解決する際には、あなたのattempを表示してください.SOはあなたが最初からタスクをやるようにするプラットフォームではありません。それはむしろあるポイントで立ち往生したときに人々が互いに助け合うプラットフォームです。 – ilim

答えて

1

まあは、最も簡単な答えは次のとおりです。char *としてエイリアスを:

int x = 42; 
int comma = 0; 
for (char *c = (char *)&x; c < (char *)(&x + 1); ++c) 
{ 
    if (comma) putchar(','); 
    comma = 1; 
    printf("%02hhx", *c); 
} 

注これはあなたにどんな順序あなたのマシンのバイトを与えますそれらを保存します(Endianness参照)。定義済みの注文が必要な場合は、追加の作業を行う必要があります。

intの表現は、のパディングビットを持つことが許可されており、この方法を使用して出力に反映されることに注意してください。また、負の数の表現は2の補数である必要はありません。現時点では違いはありませんが、が保証されたの表現を希望される場合は、stdint.hから固定サイズの整数に番号を格納してください。 intの代わりにint32_t

+0

これはうまくいくと思いますが、ちょっとスケッチです。 「整数は任意のポインタ型に変換できます。先に指定した場合を除いて、結果は実装定義であり、正しく整列されず、参照される型の エンティティを指していない可能性があります。トラップ表現 " – cnicutar

+0

@cnicutarこれは整数をポインタに変換しません。 'int *'を 'char *'に変換します。この 'char * 'を逆参照すると、常に明確に定義され、格納された値の正確な表現を読み取ることが保証されます。 –

+0

ああ、そうだよ。私は混乱していた。それではそれほど抽象的ではありません:) – cnicutar

関連する問題