ページ 1 / 1
フォーマットを指定して、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さん
変換のことしかあたまになくて、桁のことまで考えられていませんでした。
先が見通せない状況で、ご迷惑をおかけしてしまいすみませんでした。