2010-09-12 37 views
1

我已經使用解包來轉換大多數數據類型,我有一個二進制文件,我解析一些小問題。我不知道如何處理一個大的64位長簽名。我認爲這個數據類型是用2的補碼存儲的。我正在閱讀的數據文件的應用程序是一個Java應用程序,所以我認爲它是2的補充。我不需要將它作爲一個數字來處理,而只是將它作爲一個字符串來處理。如何將二進制文件中的64位Java解析爲PHP字符串?

回答

0

Java 64位整數確實存儲爲「網絡順序」(大端,即以最高有效字節開始)的8字節2的補碼格式。因此,通常你每次都要採用字節,向左移8,重複。字節值可以認爲是無符號的(雖然結果是有符號的),但是左移這並不重要。因此:首先,您只是從字節創建了等效的64位int,然後從那裏顯示。沒有意義使用捷徑;儘管這是可能的,但最終只會出現更復雜,效率更低的代碼。

+0

我想我忘了提,我正在使用的PHP是32位的。我想我需要嘗試與BCMath圖書館或一些這樣的工作? – fadeddata 2010-09-12 15:25:44

+0

在這種情況下,我認爲32位不重要,它不應該影響「較大」數據類型的存在(而是與尋址等有關)。但我有點PHP新手,所以我希望其他人可以證實這一點。 – StaxMan 2010-09-13 02:27:11

+0

PHP的整數大小取決於平臺。一個32位操作系統將只有一個32位有符號整數。任何溢出的東西都會被轉換爲浮動。 – Matthew 2010-11-21 02:31:55

0

32位PHP將只有32位整數簽名,據我所知,沒有辦法本地解包數據。

下面的代碼應該能夠讀取大端,補64位整數:

<?php 
function read_int64($fp) 
{ 
    $hex = unpack('H16a', fread($fp, 8)); 
    $hex = '0x'.$hex['a']; 

    $n = gmp_init($hex); 

    if (gmp_testbit($n, 63)) 
    { 
    $n = gmp_xor($n, '0xffffffffffffffff'); // flip the bits 
    $n = gmp_neg(gmp_add($n, 1));   // add one and negate 
    } 

    return gmp_strval($n); 
} 
?> 

它返回整數爲字符串。它可用於像:

$fp = fopen('test.bin', 'rb'); 
echo read_int64($fp)."\n"; 
fclose($fp); 

(編輯:更新的代碼來調用較少的GMP功能。)

相關問題