フォーマットを指定して、10進数を16進数に変換したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
shiro4ao
記事: 224
登録日時: 14年前
住所: 広島

フォーマットを指定して、10進数を16進数に変換したい

#1

投稿記事 by shiro4ao » 14年前

10進数を16進数に変える処理をつくろうとしています。出力を
0x110x220x33
という風に2文字ずつで区切りたいのですが、大きな数を渡すと
5000が0x1388
のようになり区切られて出てこずうまくいきません。
5000は0x130x88
という感じで出てきて欲しいのです。
なにか良い方法はあるでしょうか?

コード:



#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	char h[10];
//	int    d=50;                         //0x32  とでてきてくれる
	int    d=5000;                      //0x21388  とでてきてしまう

	sprintf(h,"0x%x",d);
	printf("d=-%d-\n",d);		
	printf("h=-%s-\n",h);	



	return 0;
	
}



最後に編集したユーザー shiro4ao on 2011年7月31日(日) 18:08 [ 編集 1 回目 ]

box
記事: 2002
登録日時: 14年前

Re: フォーマットを指定して、10進数を16進数に変換したい

#2

投稿記事 by box » 14年前

shiro4ao さんが書きました: 5000が0x21388
のようになり区切られて出てこずうまくいきません。
私のところでは、そういう結果を得ません。
質問者さんのところでは、本当に
0x21388
という結果を得ていますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
shiro4ao
記事: 224
登録日時: 14年前
住所: 広島

Re: フォーマットを指定して、10進数を16進数に変換したい

#3

投稿記事 by shiro4ao » 14年前

すみません。先ほど確認したところ、
0x1388
と出てきました。電卓で5000を計算してこの値になったのでこちらが正しいようです。
はじめの投稿が誤りだったようです。

申し訳ありませんでした。はじめの投稿は編集致します。

non
記事: 1097
登録日時: 14年前

Re: フォーマットを指定して、10進数を16進数に変換したい

#4

投稿記事 by non » 14年前

shiro4ao さんが書きました:10進数を16進数に変える処理をつくろうとしています。出力を
0x110x220x33
という風に2文字ずつで区切りたいのですが、

5000は0x210x380x08
という感じで出てきて欲しいのです。
16進数で5ケタの場合、たとえば 0x12345のとき
この例で行くと
0x120x340x05 のように最後の桁は 0x05にしなくてはいけないのですね。
何のためにこんな出力が必要なのでしょうか?
non

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: フォーマットを指定して、10進数を16進数に変換したい

#5

投稿記事 by bitter_fox » 14年前

shiro4ao さんが書きました:10進数を16進数に変える処理をつくろうとしています。出力を
0x110x220x33
という風に2文字ずつで区切りたいのですが、大きな数を渡すと
5000が0x21388
のようになり区切られて出てこずうまくいきません。
5000は0x210x380x08
という感じで出てきて欲しいのです。
文字列に落とし込んで、頭に"0x"を入れながら二字ずつ出力すればよいのではないでしょうか?

コード:

0x12345の場合
  12  34   5   落とし込んだ文字列(12345)
0x  0x  0x0    二字毎に0xを頭に入れる(文字数が奇数の時は最後の出力の時に0xに加え0も出力する)
------------
0x120x340x05
文字列に落とし込むにはsprintf関数などを使用してください。
http://www9.plala.or.jp/sgwr-t/lib/sprintf.html
最後に編集したユーザー bitter_fox on 2011年7月31日(日) 18:46 [ 編集 1 回目 ]

アバター
shiro4ao
記事: 224
登録日時: 14年前
住所: 広島

Re: フォーマットを指定して、10進数を16進数に変換したい

#6

投稿記事 by shiro4ao » 14年前

>nonさん
Socks4を使いたいのですが、そのパケットで16進数を流さないといけないので
そのような並びにしているのです。
そのまま(0xを付けずに)おくると、通信できないようでした・・・・・

>bitter_foxさん
やはり、sprintfで整形していくしかないようですね・・・・


一応これで解決とさせて頂きます。
ありがとうございます。

non
記事: 1097
登録日時: 14年前

Re: フォーマットを指定して、10進数を16進数に変換したい

#7

投稿記事 by non » 14年前

shiro4ao さんが書きました:>nonさん
Socks4を使いたいのですが、そのパケットで16進数を流さないといけないので
そのような並びにしているのです。
そのまま(0xを付けずに)おくると、通信できないようでした・・・・・
Sock4のことは、わかりませんが、私が尋ねたかったことは、0xをつけることではなく、
なぜ、最後の桁が、0x05なのかということです。
まあ、そういう仕様ならしようがない。
shiro4ao さんが書きました: >bitter_foxさん
やはり、sprintfで整形していくしかないようですね・・・・
sprintfを使いたくない(たとえば、プログラムサイズをコンパクトにしたい)というのでしたらこのようにすることもできます。

コード:

#include <stdio.h>

void hex_change(char *h,int num)
{
	int temp=num;
	int i=0,j=0;
	while(temp>=16){
		i++;
		temp/=16;
	}
	while(i>=0){
		temp=(num >> (i*4)) & 0xf;
		if(j % 2 == 0){
			*h++='0';
			*h++='x';
			if(i==0)
				*h++='0';
		}
		*h++='0'+temp;
		j++;
		i--;
	}
	*h='\0';
}
int main(void)
{
    char h[100];
    int  d=0x12345;

	hex_change(h,d);
	puts(h);

    return 0;
    
}
non

アバター
shiro4ao
記事: 224
登録日時: 14年前
住所: 広島

Re: フォーマットを指定して、10進数を16進数に変換したい

#8

投稿記事 by shiro4ao » 14年前

2文字ずつ区切って送信すると一応うまくいくので
0x05をおくるようになっているみたいです・・・・

作っていただいたhex_change関数を使わせていただきました
ありがとうございます。

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

Re: フォーマットを指定して、10進数を16進数に変換したい

#9

投稿記事 by バグ » 14年前

こんなのはどうでしょう?
unsigned charが1Byte、intが4ByteのVC++6.0の環境では動きました。

コード:

#include <stdio.h>

int main(void)
{
  int i = 0;
  int d = 5000;

  for (i = 0; i < sizeof(int) / sizeof(unsigned char); ++i)
    printf("0x%02x\n", ((unsigned char*)&d)[i]);

  return 0;
}
出力結果
0x88
0x13
0x00
0x00

pie

Re: フォーマットを指定して、10進数を16進数に変換したい

#10

投稿記事 by pie » 14年前

要求仕様に無理があると思います。
0x12345と0x123405はどうやって区別するの?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: フォーマットを指定して、10進数を16進数に変換したい

#11

投稿記事 by みけCAT » 14年前

pie さんが書きました:要求仕様に無理があると思います。
0x12345と0x123405はどうやって区別するの?
0x12345→0x010x230x45とする仕様に変更すればこの問題は解決するかな?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
shiro4ao
記事: 224
登録日時: 14年前
住所: 広島

Re: フォーマットを指定して、10進数を16進数に変換したい

#12

投稿記事 by shiro4ao » 14年前

ポート番号と接続先のIPアドレスをおくるためなので、最大でも
ポート番号は65535、アドレスは255まであればいいので、
そこまで大きな数を変換する必要はなさそうです。

ただ、奇数桁の場合はみけCATさんの方法で桁を埋める必要があるようです。
詳細がわからずに作っているので、おかしな所がたくさんあるかも知れません。
すみません。

non
記事: 1097
登録日時: 14年前

Re: フォーマットを指定して、10進数を16進数に変換したい

#13

投稿記事 by non » 14年前

shiro4ao さんが書きました:ただ、奇数桁の場合はみけCATさんの方法で桁を埋める必要があるようです。
詳細がわからずに作っているので、おかしな所がたくさんあるかも知れません。
すみません。
いまさら、そんなことを言って欲しくないなぁ。だから、最初にあんなに確認したのに。
non

アバター
shiro4ao
記事: 224
登録日時: 14年前
住所: 広島

Re: フォーマットを指定して、10進数を16進数に変換したい

#14

投稿記事 by shiro4ao » 14年前

>nonさん
変換のことしかあたまになくて、桁のことまで考えられていませんでした。
先が見通せない状況で、ご迷惑をおかけしてしまいすみませんでした。

閉鎖

“C言語何でも質問掲示板” へ戻る