首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP 32位如何比较uint64中的字符串表示和二进制表示?

PHP 32位如何比较uint64中的字符串表示和二进制表示?
EN

Stack Overflow用户
提问于 2016-08-19 12:25:01
回答 1查看 403关注 0票数 5

先决条件

PHP 5.3.6 32位(移动到64位是不可能的).

需要比较两个值uint64 (8字节无符号整数).其中一个是字符串,另一个是二进制字符串

问题

是否可以将字符串表示uint64转换为8字节的数组,或者将8字节的数组转换为PHP32位上的uint64string

插图

我尝试了base_convert函数来比较基-2字符串表示,得到了奇怪的结果。我知道字节数组包含与对应字符串相同的uint64。但我不知道如何确保它们代表相同的数字。

这是带有一些实际值的测试代码,用来说明这个问题:

代码语言:javascript
复制
function byte_to_base2string($byte)
{
    $byte = base_convert($byte, 10, 2);
    $byte = str_pad($byte, 8, '0', STR_PAD_LEFT);
    return $byte;
}

function print_info($base10_string1, $bin_string2)
{
    $bin_string1 = null; // TODO: how to obtain it?
    $base2_string1 = base_convert($base10_string1, 10, 2);
    $base2_string1 = str_pad($base2_string1, 64, '0', STR_PAD_LEFT);

    $base2_string2 = array_map('byte_to_base2string', $bin_string2);
    $base2_string2 = implode('', $base2_string2);
    $base10_string2 = base_convert($base2_string2, 2, 10);

    echo sprintf("Wrong base-2 string:\n%s\t%s\n", $base10_string1, $base2_string1);
    echo sprintf("base-2 string matches $base10_string1, but base-10 string does not\n%s\t%s\n", $base10_string2, $base2_string2);
    echo "\n";

    // Can't compare because:
    // $base2_string1 != $base2_string2
    // $base10_string1 != $base10_string2
    // $bin_string1 no idea how to convert
}

$strings = [
    '288512493108985552',
    '288512958990381002',
    '288512564016815754'
];

// obtained via unpack('C*', $binaryStr)
$bytes = [
    [4, 1, 0, 149, 121, 5, 254, 208],
    [4, 1, 1, 1, 241, 183, 239, 202],
    [4, 1, 0, 165, 251, 117, 158, 138]
];

array_map('print_info', $strings, $bytes);

产出如下:

代码语言:javascript
复制
Wrong base-2 string:
288512493108985552  0000010000000001000000001001010101111001000001011111111011000000
base-2 string matches 288512493108985552, but base-10 string does not
288512493108985526  0000010000000001000000001001010101111001000001011111111011010000

Wrong base-2 string:
288512958990381002  0000010000000001000000010000000111110001101101111110111111000000
base-2 string matches 288512958990381002, but base-10 string does not
288512958990381002  0000010000000001000000010000000111110001101101111110111111001010

Wrong base-2 string:
288512564016815754  0000010000000001000000001010010111111011011101011001111010000000
base-2 string matches 288512564016815754, but base-10 string does not
288512564016815764  0000010000000001000000001010010111111011011101011001111010001010

已更新

找到了一个解决方案(见下面的答案),但不确定这是否是最好的方法。仍然希望能找到更清晰、更直接的东西。

EN

回答 1

Stack Overflow用户

发布于 2016-08-19 14:34:07

你的PHP版本中有GMP库吗?http://php.net/manual/en/intro.gmp.php它可以在3个字符串中完成所有的工作:

代码语言:javascript
复制
$a = gmp_init('892348924892894240808924308925', 10);
$b = gmp_init('111111111010101010101011110101010101001010101010101010101011', 2);

var_dump(gmp_compare($a, $b));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39039006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档