• ベストアンサー

bigintのpack

Perlで16進数→10進数→二進数の変換を行うために packとunpackを使用するのですが 32ビット以上の数であるためにbigintを使用しています。 そのときに 10進→二進変換 二進→10進変換などはどのように行えば良いのでしょうか? 32bitまでならば sub bin_dec { return (unpack("N",(pack("B32", $_[0])))); } sub dec_bin { return (unpack("B32", pack("N", $_[0]))); } のように行えるのですが Nは32bitのlong型のままですので 4294967295以上の数は4294967295になってしまいます。 どうすれば良いのでしょうか? Bit/Vectorモジュールは使えないものとします。

noname#19884
noname#19884
  • Perl
  • 回答数3
  • ありがとう数6

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

use bigint; してれば 10進→二進変換 $i=4294967295+1; print Math::BigInt::as_bin($i); #結果:0b100000000000000000000000000000000 二進→10進変換 $b=0b100000000000000000000000000000001; print $b; #結果:4294967297 のようにそのままできます

noname#19884
質問者

お礼

できました~、ありがとうございます。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

二進→10進変換 $x = Math::BigInt->new('0b100000000000000000000000000000001'); でもいいですけど

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

perlを使用されている環境が不明ですのでなんともいえませんが、 1.貴方の環境が64ビット整数をサポートするマシン(Cコンパイラ)で、かつperlが64ビット整数をサポートしている場合は、packのオプションで q/Q(quad=64ビット整数)が使用可能です。 これが、使用できるならこれを使用すればできると思います。 2.もし使用できないなら、自前で 16進数→10進数→二進数の関数を作らざるを得ないと思います。

関連するQ&A

  • エクセル DEC2BIN 範囲外数値の演算

    エクセルの2進数変換関数の「DEC2BIN」について、 -32768から32767の範囲の数値を符号付の16bitへ変換したく、 調べたところDEC2BIN関数にたどり着いたのですが、 -512から511の範囲外では、使用できず、エラーが返ってきます。 何か良い解決策は、ないでしょうか? 初めての質問となりますが、よろしくお願いいたします。

  • 10進数→2進数の出力について

    コマンドライン引数から10進数の値を入力して 2進数に変換して出力しようとしています。 ※入力される10進数の値はかなり大きなものを想定しています。 現在は下記のようなコードで変換しようとしていますが失敗しています。 動作環境は『WindowsXP、Activeperl-5.12.4.1205』です。 拙い説明ですが、よろしくお願いいたします。 # コマンドライン引数は「9223372036854775808」 $n = unpack("B8", pack("C", $ARGV[0])); print n; # 実行結果は「11111111」 # 期待している出力結果は「1000・・・000」(←0が64個) 9223372036854775808

    • ベストアンサー
    • Perl
  • Perlで数が正しくファイルに読み書き出せません

    Perlで、下のように300の数を読み書きしたところ、 10、26、266、282 だけ正しく読み出せません。なぜですか? open (FRED,"+<test"); $pack_format = "I"; $pack_length=length pack($pack_format,0); for ($n=0;$n<300;$n++){ $age=$n; seek(FRED,$pack_length*$n,0); print FRED pack($pack_format,$age); } for ($n=0;$n<300;$n++){ seek(FRED,$pack_length*$n,0); $qqq=read (FRED,$buf,$pack_length); $age=unpack $pack_format,$buf; print "/$n/$age/$qqq/\n"; }

    • ベストアンサー
    • Perl
  • データをCGIに渡す形式に変換する。

    中に入れ子で別のCGIが入っているCGIを考えました。 <iframe ・・・ action="入れ子.cgi?data1=なんたら&data2=かんたら"></iframe> みたいな感じです。 data1とdata2は親のCGIで考えて入れ子のCGIに渡します。 ところでCGIにマルチバイト文字を渡す場合は、何らかの処理をして  %([a-fA-F0-9][a-fA-F0-9]) の形式に変換されます。 これを元に戻す方法が  =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; であることは分かったのですが、ならば元の文字列を  %([a-fA-F0-9][a-fA-F0-9]) に変換する方法が  =~s/[^a-fA-F0-9]/unpack("H2", $1)/g; かと思いきや、うまく動きません。 どのように式を書けばいいのでしょうか? #! usr/bin/perl -d use utf8; binmode(STDOUT,'utf8'); our %in=(textfield=>'テスト',submit=>'送信'); foreach(keys %in) { my $unpack=$in{$_}; my $unpack=~s/[^a-fA-F0-9]/unpack("H2", $1)/g; my $pack=$unpack; $pack=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; print "$_ &nbsp; $in{$_} &nbsp; $unpack &nbsp; $pack <br>\n"; }

    • ベストアンサー
    • Perl
  • 文字型変数を使って2進数表示すると、最上位ビットに1を立てると値に-記号が入ってしまいます

    VB6.0 WindowsXP 掲題の件ですが以下のコードを使って16進数を2進数表示にしていますが、最上位ビットに1を立てると値がおかしくなってしまいます。 Private Sub Form_Load() Dim dat(5) As Variant Dim i As Variant dat(0) = Right("0000000000000000" & Hex2Bin(Hex(&HFFFF)), 16) dat(1) = Right("0000000000000000" & Hex2Bin(Hex(&HFFFE)), 16) dat(2) = Right("0000000000000000" & Hex2Bin(Hex(&HFF00)), 16) dat(3) = Right("0000000000000000" & Hex2Bin(Hex(&HF000)), 16) dat(4) = Right("0000000000000000" & Hex2Bin(Hex(&HF0F0)), 16) dat(5) = Right("0000000000000000" & Hex2Bin(Hex(&H7FFF)), 16) For i = 0 To 5 Label1.Caption = Label1.Caption & dat(i) & vbCrLf Next Label2.Caption = "FFFF" & vbCrLf & "FFF0" & vbCrLf & "FF00" & vbCrLf & "F000" & vbCrLf & "F0F0" End Sub Public Function Hex2Bin(Hex) Dim Dec Dec = CInt("&H" + Hex) Hex2Bin = Dec2Bin(Dec) End Function Public Function Bin2Hex(Bin) Dim Dec Dec = Bin2Dec(Bin) Bin2Hex = Hex(Dec) End Function Public Function Dec2Bin(ByVal Dec) Do Dec2Bin = CStr(Dec Mod 2) & Dec2Bin Dec = Dec \ 2 Loop Until Dec = 0 End Function Public Function Bin2Dec(Bin) Dim i As Integer For i = 1 To Len(Bin) Bin2Dec = Bin2Dec * 2 + CInt(Mid(Bin, i, 1)) Next End Function なぜこうなってしまうのか、最上位に1を入れても1000000000000 のように表示させるにはどうしたらよいか教えていただきたいです。 よろしくお願いします。

  • 10進数の2進数文字列変換

    10進数の2進数文字列変換 ◆開発環境 OS:Linux(Ubuntu9.10) コンパイラ:gcc4.4 言語:C ◆質問内容 ポインタ*Aに格納されている10進数を2進数の文字列に変換し、 文字配列Bに格納したい。 バッファとして*fpを準備。 webで調査した結果を以下のソースのようにアレンジしましたが、 fputc関数の処理で、プログラムが強制終了してしまいます。 何か、良い方法ございませんでしょうか。 ◆サンプルソース void Dec_conv_bit(long *A,char *B){ unsigned int bit,n; //ビット比較用 unsigned int *fp = &n; n = (unsigned int)A; for(bit = 1 << sizeof(int)*8-1; bit > 0; bit >>= 1){ fputc((n & bit)?'1':'0',fp); } sprintf(B,"%s",fp); //putchar('\n'); }

  • 配列を引数とするサブルーチンに関する質問

    配列を引数とするサブルーチンに関する質問です。 Trimと Hex2Decのサブルーチンをインターネットを参考に作りました。 下記のスクリプトは > perl test.pl で期待通りに動きます。 質問は、サブルーチンの中における、 for (@out) { $_=hex; } です。 trimの方では、$_がなくても、きちんと動きます。(あってもOK、$_=~s/^\s+//; $_=~s/\s+$//;) Hex2Decの方は、$_=hex; でないと動きません。 これは、for (@out) { }でひとつずつ処理する対象が、$_に入っている。 処理結果の格納先が、s/^\s+//; の場合は、記述無き時は、 $_と暗黙できまっているのに対し、 hex;の場合は、そうではない。明示的に与えてやらなければいけない。 こういう理解で、良いでしょうか? 他に、やりようはあるのでしょうか? 宜しくお願いいたします。 test.pl ----------------------------------------- $a=10,print "Hex=".$a." --> Dec=".&Hex2Dec($a)."\n"; $a=20,print "Hex=".$a." --> Dec=".&Hex2Dec($a)."\n"; @a=('a','b','c','d'); @b=&Hex2Dec(@a); print "Hex=@a --> Dec=@b\n"; $a=' a ',print "org=$a --> trimed =".&trim($a)."xxxxx\n"; $a=' b ',print "org=$a --> trimed =".&trim($a)."xxxxx\n"; @a=(' a ',' a ',' a ',' a '); @b=&trim(@a); print "org=@a --> trimed= @b\n"; sub trim { my @out = @_; for (@out) { s/^\s+//; s/\s+$//; } return wantarray ? @out : $out[0]; } sub Hex2Dec { my @out = @_; for (@out) { $_=hex; } return wantarray ? @out : $out[0]; } ------------------------------------------------

    • ベストアンサー
    • Perl
  • HEX2BIN関数の使い方。

    HEX2BINを使用して16進数4桁を2進数に変換しようとしたところ=HEX2BIN(B2) (B2セルは6F67)としたところ#NUMエラーが出てしまいます。 B2を”B2”にすれば変換ができたのですが今度はオートフィルが使えなくなってしまいます。 なので、=HEX2BIN(B2)で変換できる方法か””をつかってもオートフィルで=HEX2BIN("C2")などにする方法を教えて下さい Excelは2007です。

  • Excelの2進数表記について

    10進数→2進数に変換する関数で、DEC2BIN(15)→1111となりますが、00001111と8桁で表示するにはどうすればよいのでしょうか。また、8桁表示できたとして、関数の結果『00001111』の前から3桁『000』を抜き出すにはどうすればよいのかご存知のかた宜しくお願い致します。

  • エクセルの16進と2進の扱いに関して

    お世話になります エクセルの16進と2進の扱いに関して教えてください DEC2HEX,DEC2BIN,HEX2BIN,BIN2HEX等を使って、 相互に数値を変換し表記する場合 (1) 16進の扱い時、0xを付ける、もしくは認識させる方法 (2) 16進の扱い時、2桁ずつ区切り-を間に入れた表記にする方法 (3) 2進の扱い時、4桁ずつ区切り空白を間に入れた表記にする方法 (4) 2進で扱える値をもっと大きくしたい(現在は255(ff)との2進変換まで) (とりあえず32Bitまででもできればたすかります) このような時、セルの書式設定等はどのように設定すればよろしいのでしょうか、 ご存知の方、ご教授お願いいたします。