• ベストアンサー

sprintfで10進数を桁数指定で16進数に変換する方法

10進数から16進数への変換自体は分かります。 $hex = sprintf("%lx",$decimal); で出来るのですが、例えば、10進数の10を16進数の0x00000Aと常に6桁にして出力するにはどうすればよいでしょう?(先頭の0xは出力しなくてもいいです。) 手元のPerl辞典には、sprintfの形式指定で出来るとなっており、指定パラメータとしてm(最小幅)というのが載っているのですが、実際の使い方の用例が無く、色々試したのですが、上手く行きません。 どなたか詳しい方、ズバッとコマンド記述の実例を一行お願いいたします。

  • Perl
  • 回答数1
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

単純に $hex=sprintf("%06X",$decimal); フラグにて 0 数値の前を0で埋める。       6 その桁数       X 16進数(大文字) では? 

taka1963
質問者

お礼

おぉっ~! そういうふうに記述するのでしたか。上手く行きました。有難うございます! 手元のPerlポケットリファレンスと言う本には、 『書式指定文字列には次のような形式があります。 %fm.nx mとnは変換される文字列の幅の指定で、フラグfや型指定子xに依存します。』 とだけ書かれていて、ご存知の方には当たり前のことなのでしょうが、初心者にはさっぱりでした。 自分なりに色々やってダメだったのですが、そういう意味だったのですね・・・。

関連するQ&A

  • 指定した文字数だけ出力する方法

    こんにちわ。 Perlプログラミングで質問です。 初心者なので、内容がわかりにくかったら申し訳ありません。 変数に入れた文字を、指定した文字数だけ表示する方法を教えて下さい。 例えば・・・ $aaa = "こんにちわ"; print "$aaa"; #こんにちわと出力される 上記のような内容で出力する時に「こんに」の3文字だけを出力したいです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 2進数の出力について

    10進数から2進数に変換するプログラムを作成したのですが、出力する値が5桁以上になると正確な値が出力されず悩んでいます。仕様としましては下記の内容です。 defineを使用し入力文字数を変更出来る(最大5桁入力可能) 入力された最大「99999」の10進数を2進数に変換。 下記のプログラムの何処を修正すれば出力出来るのでしょうか? //10進数文字を数字の2進数で表示// #include "stdafx.h" #define HEX 5 //「function」:入力文字された文字の処理// char ToInt( char cInt) { int mal=0; switch (cInt){ case '0': mal=0; break; case '1': mal=1; break; case '2': mal=2; break; case '3': mal=3; break; case '4': mal=4; break; case '5': mal=5; break; case '6': mal=6; break; case '7': mal=7; break; case '8': mal=8; break; case '9': mal=9; break; } return (mal); } //「function」:入力文字された文字数// char HexInt( char eInt) { char mul=0; switch (eInt){ case '0': mul='0'; break; case 0: mul='0'; break; case 1: mul='1'; break; } return (mul); } //「function」:桁数の計算(10×指数を計算)// int HexAcc( int n ) { int i; int ans=1; for( i=0; i<n; i++ ){ ans *= 10; } return (ans); } int _tmain(int argc, _TCHAR* argv[]) { int i=0,n=0,j=0,s=0,k=0,m=0,e=0,ans=0, add=0; char decimal[255], ditto[255],sub[255],temp[255],chg[255],siu[255]; //入力されない場合// if( argc > 1){ } else{ printf("10進数を入力してください。\n"); return 1; } for( k=0; k < HEX; k++ ){ //文字として'0'を代入//////////////////////////// sub[k] = '0'; //subに文字として'0'を代入// temp[k] = '0'; //tempに文字として'0'を代入// chg[k] = '0'; //chgに文字として'0'を代入// siu[k] = '0'; //siuに文字として'0'を代入// } //入力された文字数を受取る// for( i=0; argv[1][i] != '\0'; i++ ){ decimal[i] = argv[1][i]; } decimal[i] = '\0'; //空白文字のチェック// for( i=0; decimal[i] != '\0'; i++ ){ if( decimal[i] != ' ' ){ ditto[n] = decimal[i]; n++; } } //'\0'を代入(文字列の終端)// ditto[n]='\0'; //「0」から「9」のループ// for( n=0; ditto[n] != '\0'; n++ ){ if(( ditto[n] == '0' ) || ( ditto[n] == '1' ) || ( ditto[n] == '2' ) || ( ditto[n] == '3' ) || ( ditto[n] == '4' ) || ( ditto[n] == '5' ) || ( ditto[n] == '6' ) || ( ditto[n] == '7' ) || ( ditto[n] == '8' ) || ( ditto[n] == '9' )){ }else{ printf("エラー\n 10進数を入力してください。\n"); return 0; } } //桁数のループ// for( n=0; ditto[n] != '\0'; n++ ){ m = m + 1 ; } //桁数の判断// if( m <= HEX ){ }else{ printf("エラー\n入力文字数は、%d文字以内にしてください。\n",HEX); return 0; } //subにdittoを代入// for( n=0; ditto[n] != '\0'; n++){ sub[HEX-m+n] = ditto[n]; } sub[HEX] = '\0'; //'\0'を代入(文字列の終端)// //sub[0]からsub[9]の計算// for( n=0; sub[n] != '\0'; n++){ ans = ToInt(sub[n]); add += ans * HexAcc(HEX-n-1); } //2進数の計算・商が0になるまで// for( n=0; sub[n] != '\0'; n++ ){ temp[n] = add % 2; add = add / 2; if( add == 0){ break; } } temp[HEX] = '\0'; //'\0'を代入(文字列の終端)// //桁数のチェック(商・余り)// for( ; n>=0; n-- ){ e = e++; } //temp・値の入替え「tempからchg」// for( n=0; sub[n] != '\0'; n++ ){ chg[HEX-n-1] = temp[n]; } chg[HEX]='\0'; //'\0'を代入(文字列の終端)// //2進数に変換// for( n=HEX; n>=0; n--){ siu[n] = HexInt(chg[n]); } siu[HEX]='\0'; //'\0'を代入(文字列の終端)// //10進数文字を2進数で表示// printf("\n10進数文字を2進数で変換した値は・・・ %s \n",siu); }

  • ひらがなから全角カタカナへの変換の仕方

    Perlでひらがなから全角カタカナへの変換の仕方について教えてください。 ここのサイトで「全角カタカナからひらがなへの変換」の仕方が書いてありました。コレを元に逆に指定すれば出来るかな?って思ったのですが。。。どうやればいいのか全くわかりません。たぶんですが文字コードなどで指定しているとは思うのですが。。。どなたかわかる方がいましたら教えて下さい。よろしくお願いします。 #全角カタカナからひらがなへの変換の仕方 $a =~ s/(\x83)([\x40-\x7e])/"\x82".sprintf("%c",ord($2)+0x5f)/eg; $a =~ s/(\x83)([\x80-\x96])/"\x82".sprintf("%c",ord($2)+0x5e)/eg; 上記の逆に「ひらがなから全角カタカナへの変換」出来るようにしたいです。よろしく御願いします。

    • ベストアンサー
    • Perl
  • C言語において、以下の条件下で、配列rbufに格納されているデータを配

    C言語において、以下の条件下で、配列rbufに格納されているデータを配列HEXに移動する方法を教えてください。 なお、C言語超初心者ですので、意味不明なことを書いてしまう可能性もありますが、宜しくお願いします。 まず、配列に関しては、 char rbuf[256]; char HEX[256]; と定義されているとします。 そして rbuf にはテキストデータが入っているものとします。 このrbufに入っているテキストデータを、16進数に変換して順番にHEXに格納したいのです。 (rbuf[1]に入っているデータを16進変換してHEX[1]に、 rbuf[2]に入っているデータを16進変換してHEX[2]に……という具合に。) お分かり頂けましたでしょうか? ちなみに以下のようなことを試してみましたがダメでした。 for(i=0;i < sign;++i){ sprintf(HEX,"%02X",rbuf[i]); } ※(signにはrbufに格納されているデータ数が入っています。) 当たり前ですが、上のように書くと、HEXは次々と上書きされ、 一番最後のデータしか入りません。 かといって次のように書くと、文法的に間違っているようでコンパイルエラーになります。 for(i=0;i < sign;++i){ sprintf(HEX[i],"%02X",rbuf[i]); } どうすればよろしいのでしょうか?

  • Perlの数値・文字列操作

    Perlで以下の16進数の連続した文字列を db444500 配列に入れて後からわかりやすい16進数で表示させたり、 foreach (@list){ print sprintf("%02X ", $_); } 直接文字列として、 0xdb, 0x44, 0x45, 0x00 と表示させるには、どのような書き方をすれば良いのでしょうか?

    • ベストアンサー
    • Perl
  • perlで一定の範囲ごとにカウントさせる方法について教えてください。

    perlで一定の範囲ごとにカウントさせる方法について教えてください。 例えば、data.txtに、-10≦n≦10の範囲で様々な数が入ったファイルがあるとして、 -10.0 ≦ x < -9.9 -9.9 ≦ x < -9.8 .... 9.8 ≦ x < 9.9 9.9 ≦ x ≦ 10.0 (←最後は≦のほうがいいですが、<でもOK) と0.1ごとに区切って、 その範囲に入る数をカウントしたいとき、 ifや+=を使って範囲を指定して、カウントアップさせる方法もありますが、 指定したい範囲の数が多いと、ifばかりをプログラム内に羅列するのは面倒です。 できれば以下のような結果が表示されるとうれしいのですが… 中間値 カウント数 -9.95 3 -9.85 6 ... すっきりした書き方はありませんか?よろしくお願いします。

  • 素数の出力

    もう一つ問題があります。 0<i<=Xのiについて素数であるものを出力する。というもので条件は 1、Xを指定し、1からXまでの数値を記憶する配列をポインタを用いて確保し、順に1からXまでの値を配列に代入する。 2、配列の各値について、それが素数かを調べる。 3、もし、2で調べた値が素数でない場合は、配列の値を-1に置き換える。 4、配列の全ての値について2、3を繰り返す。 5、すべて調べ終えたら、配列の中身を添字0から順に表示してゆく。 その際、値が -1の場合にはなにも表示しない。 です。 まったく分かりません。教えてください。 素数を調べるー>割算のあまりをみる。 順に調べるー>forをつかう。 -1に置き換え ぐらいしかわかりません。 ちなみに割算でのあまりの検証の仕方も分からないです。 教えてください。

  • 日本語でクッキーを読み書きしたいんですが。

    初心者用の文献読むのですが、クッキーはカウンターの説明ばかりで、日本語を扱えません。 また、クッキーの解説HPでは、 >CGI(Perl)でエンコードするには次のようにします。 >$xx =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; >CGI(Perl)でデコードするには次のようにします。 >$xx =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; と、書いてあるのですが、どこを書き換えればいいのでしょうか。ぜひご伝授をお願いします。 なお、只今改造中のソースは以下のURL掲載に掲載されております。 http://softplaza.biglobe.ne.jp/text/cgi/cgi13/cgi13-4.html

    • 締切済み
    • CGI
  • C言語 変換指定%sについてです。

    現場での経験もあるPGなのですが、C言語の基礎を復習していたら疑問に思うことが出てきてしまったので、質問させて下さい。 printf関数などに使われる変換指定%sについてですが、 char word[] = "test"; char *pointer; pointer = word; とした場合、pointerの値は文字列wordの先頭アドレスになるので、 printf ("%x", pointer); とすれば、そのアドレス値が表示されるのはとてもよくわかるのですが、 printf ("%s", pointer); とした場合に、"test"と表示されるのがイマイチ納得できないんです。 printf ("%s", *pointer); なら、まだわかるんですけど・・・ 変換指定の%sというものは、 「アドレスを受け取って、受け取ったアドレスにある文字列を\0がくるまで表示する」 というものなのでしょうか? int型のポインタで同じように printf ("%d", pointer); とすると、pointerの値であるアドレスが10進数表示されて、pointerが指している変数の値を表示するには、 printf ("%d", *pointer); としなければならないわけで、そういうことをいろいろ考えていたら、収拾がつかなくなってしまって(^_^;) 「とにかく%sはそういうものなの!!」と丸暗記すれば困るようなことはないのですが、どうにもモヤモヤしっぱなしなので、%sの動きについて詳しくお分かりの方がいらっしゃいましたら、ご教授下さい。 よろしくお願いしますm(__)m

  • Access2007 総ページ数が狂う

    Access2007 OS:WindowsXP A4横の帳票を出力していますが、 総ページ数が正しく表示されず困っています。 ページフッターのテキストボックスで =[Page] & "/" & [Pages] と設定していまして、 最終頁をみると、289/300 のようにずれています。 印刷しても、プレビューで見ても同じ様にずれます。 レポートのレコードソースはクエリで、 クエリに指定したパラメータによって総件数もかわるのですが、 289/300 だったり、 350/340 だったりと、 実際のページより多かったり、少なかったりとまちまちです。 もし、同じような経験された方がいらっしゃいましたら、 アドバイスお願いします。 実際に現象がでるパソコンが手元にないので、 すぐには確認できないこともありますが、 情報不足などがありましたらご指摘ください。

専門家に質問してみよう