Php 如何读/写64位无符号小端整数? 不支持它们,因此如何读取和写入64位无符号小字节编码整数(< p>),可以将64位数字视为8字节二进制数据的不透明块,并使用通常的字符串操作函数来处理它们(即子字符串< /代码>和点运算符)。
无论何时(如果)需要对其执行算术运算,都可以使用两个包装函数以十六进制表示形式对该块进行编码/解码(在我的实现中,我称之为中间类型Php 如何读/写64位无符号小端整数? 不支持它们,因此如何读取和写入64位无符号小字节编码整数(< p>),可以将64位数字视为8字节二进制数据的不透明块,并使用通常的字符串操作函数来处理它们(即子字符串< /代码>和点运算符)。,php,Php,无论何时(如果)需要对其执行算术运算,都可以使用两个包装函数以十六进制表示形式对该块进行编码/解码(在我的实现中,我称之为中间类型hex64),并使用您喜欢的外部库来完成真正的工作: <?php /* Save as test.php */ function chunk_to_hex64($chunk) { assert(strlen($chunk) == 8); return strrev(bin2hex($chunk)); } function hex64_to_
hex64
),并使用您喜欢的外部库来完成真正的工作:
<?php
/* Save as test.php */
function chunk_to_hex64($chunk) {
assert(strlen($chunk) == 8);
return strrev(bin2hex($chunk));
}
function hex64_to_chunk($hex64) {
assert(strlen($hex64) == 16);
return strrev(pack('h*', $hex64));
}
// Test code:
function to_hex64($number) {
$hex64 = base_convert($number, 10, 16);
// Ensure the hex64 is left padded with '0'
return str_pad($hex64, 16, '0');
}
for ($number = 0.0; $number < 18446744073709551615.0; $number += 2932031007403.0) {
$hex64 = to_hex64($number);
$hex64_reencoded = chunk_to_hex64(hex64_to_chunk($hex64));
assert($hex64_reencoded == $hex64, "Result is $hex64_reencoded, expected $hex64");
}
$data = file_get_contents('test.php');
// Skip the last element because it is not 8 bytes
$chunks = array_slice(str_split($data, 8), 0, -1);
foreach ($chunks as $chunk) {
$hex64 = to_hex64($number);
$chunk_reencoded = hex64_to_chunk(chunk_to_hex64($chunk));
assert($chunk_reencoded == $chunk, "Result is $chunk_reencoded, expected $chunk");
}
我编写了一个用于打包/解包64位无符号整数的程序
相关位仅为两行:
$ints = unpack("@$offset/Vlo/Vhi", $data);
$sum = Math::add($ints['lo'], Math::mul($ints['hi'], '4294967296'));
(Math::*
是bcmath的简单包装)
包装:
$out .= pack('VV', (int)bcmod($args[$idx],'4294967296'), (int)bcdiv($args[$idx],'4294967296'));
它将64位整数拆分为两个32位整数,64位PHP应该支持哪一个:-)这没有帮助吗?64位无符号整数在任何PHP构建AFAIK中都不可用。所以你需要一些类似GMP的东西。@Jon 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,但我不确定这与我的评论有什么关系。为什么不直接拆分/组合成两个32位无符号整数,并通过两个调用以小尾端格式读/写它们呢?0xFFFFFFFFFFFFFF是>PHP_INT_MAX,即使在64位机器上也是如此。这是故意的吗?这是测试的一部分,所以没关系:我手头没有32平台。无论如何,我将它改为使用浮点,所以我认为它可以在32位平台上运行而不会出现问题。0xFFFFFFFFFFFF已经自动转换为浮点。实际上,循环甚至没有使用$number
,因此我不确定您在测试什么。循环使用$number
,但我上次的编辑将格式设置搞砸了。我刚刚添加了丢失的新行。