ページ 11

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

Posted: 2011年7月31日(日) 14:33
by shiro4ao
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;
	
}




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

Posted: 2011年7月31日(日) 15:17
by box
shiro4ao さんが書きました: 5000が0x21388
のようになり区切られて出てこずうまくいきません。
私のところでは、そういう結果を得ません。
質問者さんのところでは、本当に
0x21388
という結果を得ていますか?

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

Posted: 2011年7月31日(日) 15:22
by shiro4ao
すみません。先ほど確認したところ、
0x1388
と出てきました。電卓で5000を計算してこの値になったのでこちらが正しいようです。
はじめの投稿が誤りだったようです。

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

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

Posted: 2011年7月31日(日) 17:44
by non
shiro4ao さんが書きました:10進数を16進数に変える処理をつくろうとしています。出力を
0x110x220x33
という風に2文字ずつで区切りたいのですが、

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

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

Posted: 2011年7月31日(日) 17:45
by bitter_fox
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

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

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

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


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

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

Posted: 2011年7月31日(日) 20:30
by non
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;
    
}

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

Posted: 2011年7月31日(日) 20:56
by shiro4ao
2文字ずつ区切って送信すると一応うまくいくので
0x05をおくるようになっているみたいです・・・・

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

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

Posted: 2011年8月01日(月) 10:21
by バグ
こんなのはどうでしょう?
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

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

Posted: 2011年8月01日(月) 16:07
by pie
要求仕様に無理があると思います。
0x12345と0x123405はどうやって区別するの?

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

Posted: 2011年8月01日(月) 17:58
by みけCAT
pie さんが書きました:要求仕様に無理があると思います。
0x12345と0x123405はどうやって区別するの?
0x12345→0x010x230x45とする仕様に変更すればこの問題は解決するかな?

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

Posted: 2011年8月02日(火) 18:45
by shiro4ao
ポート番号と接続先のIPアドレスをおくるためなので、最大でも
ポート番号は65535、アドレスは255まであればいいので、
そこまで大きな数を変換する必要はなさそうです。

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

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

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

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

Posted: 2011年8月03日(水) 00:37
by shiro4ao
>nonさん
変換のことしかあたまになくて、桁のことまで考えられていませんでした。
先が見通せない状況で、ご迷惑をおかけしてしまいすみませんでした。