フォーマットを指定して、10進数を16進数に変換したい
フォーマットを指定して、10進数を16進数に変換したい
10進数を16進数に変える処理をつくろうとしています。出力を
0x110x220x33
という風に2文字ずつで区切りたいのですが、大きな数を渡すと
5000が0x1388
のようになり区切られて出てこずうまくいきません。
5000は0x130x88
という感じで出てきて欲しいのです。
なにか良い方法はあるでしょうか?
0x110x220x33
という風に2文字ずつで区切りたいのですが、大きな数を渡すと
5000が0x1388
のようになり区切られて出てこずうまくいきません。
5000は0x130x88
という感じで出てきて欲しいのです。
なにか良い方法はあるでしょうか?
最後に編集したユーザー shiro4ao on 2011年7月31日(日) 18:08 [ 編集 1 回目 ]
Re: フォーマットを指定して、10進数を16進数に変換したい
私のところでは、そういう結果を得ません。shiro4ao さんが書きました: 5000が0x21388
のようになり区切られて出てこずうまくいきません。
質問者さんのところでは、本当に
0x21388
という結果を得ていますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: フォーマットを指定して、10進数を16進数に変換したい
すみません。先ほど確認したところ、
0x1388
と出てきました。電卓で5000を計算してこの値になったのでこちらが正しいようです。
はじめの投稿が誤りだったようです。
申し訳ありませんでした。はじめの投稿は編集致します。
0x1388
と出てきました。電卓で5000を計算してこの値になったのでこちらが正しいようです。
はじめの投稿が誤りだったようです。
申し訳ありませんでした。はじめの投稿は編集致します。
Re: フォーマットを指定して、10進数を16進数に変換したい
16進数で5ケタの場合、たとえば 0x12345のときshiro4ao さんが書きました:10進数を16進数に変える処理をつくろうとしています。出力を
0x110x220x33
という風に2文字ずつで区切りたいのですが、
5000は0x210x380x08
という感じで出てきて欲しいのです。
この例で行くと
0x120x340x05 のように最後の桁は 0x05にしなくてはいけないのですね。
何のためにこんな出力が必要なのでしょうか?
non
- bitter_fox
- 記事: 607
- 登録日時: 14年前
- 住所: 大阪府
Re: フォーマットを指定して、10進数を16進数に変換したい
文字列に落とし込んで、頭に"0x"を入れながら二字ずつ出力すればよいのではないでしょうか?shiro4ao さんが書きました:10進数を16進数に変える処理をつくろうとしています。出力を
0x110x220x33
という風に2文字ずつで区切りたいのですが、大きな数を渡すと
5000が0x21388
のようになり区切られて出てこずうまくいきません。
5000は0x210x380x08
という感じで出てきて欲しいのです。
0x12345の場合
12 34 5 落とし込んだ文字列(12345)
0x 0x 0x0 二字毎に0xを頭に入れる(文字数が奇数の時は最後の出力の時に0xに加え0も出力する)
------------
0x120x340x05
http://www9.plala.or.jp/sgwr-t/lib/sprintf.html
最後に編集したユーザー bitter_fox on 2011年7月31日(日) 18:46 [ 編集 1 回目 ]
Re: フォーマットを指定して、10進数を16進数に変換したい
>nonさん
Socks4を使いたいのですが、そのパケットで16進数を流さないといけないので
そのような並びにしているのです。
そのまま(0xを付けずに)おくると、通信できないようでした・・・・・
>bitter_foxさん
やはり、sprintfで整形していくしかないようですね・・・・
一応これで解決とさせて頂きます。
ありがとうございます。
Socks4を使いたいのですが、そのパケットで16進数を流さないといけないので
そのような並びにしているのです。
そのまま(0xを付けずに)おくると、通信できないようでした・・・・・
>bitter_foxさん
やはり、sprintfで整形していくしかないようですね・・・・
一応これで解決とさせて頂きます。
ありがとうございます。
Re: フォーマットを指定して、10進数を16進数に変換したい
Sock4のことは、わかりませんが、私が尋ねたかったことは、0xをつけることではなく、shiro4ao さんが書きました:>nonさん
Socks4を使いたいのですが、そのパケットで16進数を流さないといけないので
そのような並びにしているのです。
そのまま(0xを付けずに)おくると、通信できないようでした・・・・・
なぜ、最後の桁が、0x05なのかということです。
まあ、そういう仕様ならしようがない。
sprintfを使いたくない(たとえば、プログラムサイズをコンパクトにしたい)というのでしたらこのようにすることもできます。shiro4ao さんが書きました: >bitter_foxさん
やはり、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
Re: フォーマットを指定して、10進数を16進数に変換したい
2文字ずつ区切って送信すると一応うまくいくので
0x05をおくるようになっているみたいです・・・・
作っていただいたhex_change関数を使わせていただきました
ありがとうございます。
0x05をおくるようになっているみたいです・・・・
作っていただいたhex_change関数を使わせていただきました
ありがとうございます。
Re: フォーマットを指定して、10進数を16進数に変換したい
0x12345→0x010x230x45とする仕様に変更すればこの問題は解決するかな?pie さんが書きました:要求仕様に無理があると思います。
0x12345と0x123405はどうやって区別するの?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: フォーマットを指定して、10進数を16進数に変換したい
ポート番号と接続先のIPアドレスをおくるためなので、最大でも
ポート番号は65535、アドレスは255まであればいいので、
そこまで大きな数を変換する必要はなさそうです。
ただ、奇数桁の場合はみけCATさんの方法で桁を埋める必要があるようです。
詳細がわからずに作っているので、おかしな所がたくさんあるかも知れません。
すみません。
ポート番号は65535、アドレスは255まであればいいので、
そこまで大きな数を変換する必要はなさそうです。
ただ、奇数桁の場合はみけCATさんの方法で桁を埋める必要があるようです。
詳細がわからずに作っているので、おかしな所がたくさんあるかも知れません。
すみません。
Re: フォーマットを指定して、10進数を16進数に変換したい
いまさら、そんなことを言って欲しくないなぁ。だから、最初にあんなに確認したのに。shiro4ao さんが書きました:ただ、奇数桁の場合はみけCATさんの方法で桁を埋める必要があるようです。
詳細がわからずに作っているので、おかしな所がたくさんあるかも知れません。
すみません。
non
Re: フォーマットを指定して、10進数を16進数に変換したい
>nonさん
変換のことしかあたまになくて、桁のことまで考えられていませんでした。
先が見通せない状況で、ご迷惑をおかけしてしまいすみませんでした。
変換のことしかあたまになくて、桁のことまで考えられていませんでした。
先が見通せない状況で、ご迷惑をおかけしてしまいすみませんでした。