我已经使用解包来转换大多数数据类型,我有一个二进制文件,我解析一些小问题。我不知道如何处理一个大的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. 从java中的二进制文件读取位字符串
- 5. 如何将二进制转换为字符或字符串?,Java
- 6. Ruby解析gzip二进制字符串
- 7. 如何将十进制转换为二进制的64位?
- 8. 将文件转换为二进制字符串与PHP
- 9. 在Java中将包含64位的二进制字符串转换为十六进制?
- 10. 如何解析erlang二进制文件中的元组,整数和字符串?
- 11. 如何按位移动java中的二进制字符串?
- 12. PHP自解压二进制字符串
- 13. 将十六进制字符串转换为32位二进制字符串
- 14. 将二进制数据(例如二进制文件)导出为.NET字符串?
- 15. 将字符串视为Ruby中的二进制文件
- 16. 如何将字符串嵌入到二进制文件中?
- 17. 将文件和字符串编码为二进制文件C#
- 18. 如何在PHP中解压二进制字符串?
- 19. 将二进制字符串转换为文本字符串
- 20. 解析大的二进制字符串以10为底
- 21. 如何将32位编译二进制转换为64位
- 22. 如何将二进制字符串转换为十进制字符串中的Java
- 23. 如何在Java中将字节转换为二进制文件?
- 24. 如何转换R中的64位十六进制字符串?
- 25. 将Base64转换为Java中的二进制字符串
- 26. 解析Ruby中的二进制文件
- 27. 字符串为二进制
- 28. 将64位无符号整数(以十六进制字符串形式)转换为java中的十进制
- 29. Go - 如何将二进制字符串转换为二进制字节?
- 30. 如何在java中获取二进制字符串的所有位的位置?
我想我忘了提,我正在使用的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