如何從binary檔案讀取數值

我有兩個binary檔案各為一系列倍精準浮點數值與整數數值

用perl如何分別讀取出來

並轉成數值

已更新項目:

binary檔案為 big-endian order

2 個已更新項目:

很感謝你的回答

利用unpack函數

整數數值部分沒有問題

但是倍精準浮點數值還是錯誤的

下面是其中倍精準浮點 4個數值的binary碼與正確數值

41 A1 D5 5D 5D 61 CA C1 40 54 53 3C 60 02 3F 3D

3F CB BF 3F 3F 08 E3 68 7E F1 DA 3F 0E E9 DA D8

1.49597870691000015E+08

8.13005600000000044E+01

4.91254745145081187E-11

7.24345248616270270E-10

1 個解答

評分
  • 匿名使用者
    1 0 年前
    最佳解答

    請參考 pack 的說明:http://perldoc.perl.org/functions/pack.html

    裡面除了有 pack, unpack 的格式說明外,

    也提到了pack, unpack 只能處理本機的浮點數,

    所以無法提供例子給你。

    範例程式如下:

    #/usr/bin/perl

    $/ = '';

    $file = 'int.txt';

    open IN, "<$file" or die "Open $file failed!: $!";

    binmode IN;

    # n An unsigned short in "network" (big-endian) order.

    # N An unsigned long in "network" (big-endian) order.

    # v An unsigned short in "VAX" (little-endian) order.

    # V An unsigned long in "VAX" (little-endian) order.

    # (These 'shorts' and 'longs' are _exactly_ 16 bits and

    # _exactly_ 32 bits, respectively.)print join(", ", unpack("n*", <IN>));

    print join( ", ", unpack( "n*", <IN> ) );

    print "\n";

    close IN;

    2007-05-30 09:41:09 補充:

    簡單翻譯一下部份來自:

    http://perldoc.perl.org/functions/pack.html

    實數(floats和doubles) 在當地機器上是唯一格式; 由於多樣性浮點數格式, 並且缺乏一個標準"網路" 表示法, 並沒有為互換而做規範。這意味著, 被包裝的浮點資料被寫在一個機器上不能是被另一個機器所閱讀的, 既使兩個使用IEEE 浮點算術(因為記憶表示法的endian-ness 並不是 IEEE spec 的部分) 。參見perlport 。

    perlport:http://perldoc.perl.org/perlport.html

    2007-05-30 09:48:30 補充:

    所以並不是不幫你,

    而是實數(floats和doubles)並沒有定義跨機器的規範,

    而是無法幫你。

    • Commenter avatar登入以對解答發表意見
還有問題?馬上發問,尋求解答。