我已經使用解包來轉換大多數數據類型,我有一個二進制文件,我解析一些小問題。我不知道如何處理一個大的64位長簽名。我認爲這個數據類型是用2的補碼存儲的。我正在閱讀的數據文件的應用程序是一個Java應用程序,所以我認爲它是2的補充。我不需要將它作爲一個數字來處理,而只是將它作爲一個字符串來處理。如何將二進制文件中的64位Java解析爲PHP字符串?
1
A
回答
0
Java 64位整數確實存儲爲「網絡順序」(大端,即以最高有效字節開始)的8字節2的補碼格式。因此,通常你每次都要採用字節,向左移8,重複。字節值可以認爲是無符號的(雖然結果是有符號的),但是左移這並不重要。因此:首先,您只是從字節創建了等效的64位int,然後從那裏顯示。沒有意義使用捷徑;儘管這是可能的,但最終只會出現更復雜,效率更低的代碼。
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功能。)
相關問題
- 1. 將二進制字符串解析爲文本/字符
- 2. 將二進制字符串解析爲JavaScript中的字節
- 3. 將64位編碼的字符串轉換爲二進制文件
- 4. 如何將二進制64位字符串轉換爲C++中的uint64_t?
- 5. 從java中的二進制文件讀取位字符串
- 6. Ruby解析gzip二進制字符串
- 7. 如何將64位二進制字符串轉換爲tcl中的十進制數字?
- 8. 將二進制字符串轉換爲二進制文字
- 9. 如何將字符串值轉換爲java中的二進制字符串
- 10. 如何將十進制轉換爲二進制的64位?
- 11. 將文件轉換爲二進制字符串與PHP
- 12. PHP將圖像文件轉換爲二進制字符串
- 13. 如何解析erlang二進制文件中的元組,整數和字符串?
- 14. 在Java中將包含64位的二進制字符串轉換爲十六進制?
- 15. 問題轉換字符串二進制(64位)爲十進制(C++中iphone)
- 16. 如何將二進制文件內容讀取爲字符串?
- 17. 如何按位移動java中的二進制字符串?
- 18. PHP自解壓二進制字符串
- 19. 如何將Base64編碼二進制字符串轉換爲java中的二進制文件?
- 20. 如何將表示爲十進制字符串的64位整數轉換爲十六進制字符串
- 21. 如何將字符串解析爲Java中的XML文檔?
- 22. 將二進制數據(例如二進制文件)導出爲.NET字符串?
- 23. 將十六進制字符串轉換爲32位二進制字符串
- 24. 字符串二進制到字符串8位數字在JAVA
- 25. 將字符串視爲Ruby中的二進制文件
- 26. 將字符串類型的二進制數字轉換爲java中的位
- 27. 如何將字符串嵌入到二進制文件中?
- 28. 將十六進制字符串轉換爲二進制字符串 - Java
- 29. 將文件和字符串編碼爲二進制文件C#
- 30. 如何在PHP中解壓二進制字符串?
我想我忘了提,我正在使用的PHP是32位的。我想我需要嘗試與BCMath圖書館或一些這樣的工作? – fadeddata 2010-09-12 15:25:44
在這種情況下,我認爲32位不重要,它不應該影響「較大」數據類型的存在(而是與尋址等有關)。但我有點PHP新手,所以我希望其他人可以證實這一點。 – StaxMan 2010-09-13 02:27:11
PHP的整數大小取決於平臺。一個32位操作系統將只有一個32位有符號整數。任何溢出的東西都會被轉換爲浮動。 – Matthew 2010-11-21 02:31:55