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
,但我上次的编辑将格式设置搞砸了。我刚刚添加了丢失的新行。