【问题标题】:PHP equivalent of Convert.ToInt32 in .NET Framework.NET Framework 中 Convert.ToInt32 的 PHP 等效项
【发布时间】:2013-07-07 07:35:10
【问题描述】:

我正在寻找一种将 8 字符字符串转换为 32 位有符号整数的简洁方法。

请参阅 MSDN 上的 Convert.ToInt32 方法参考。

这是当前在 VB 中的 .NET 代码:

Convert.ToInt32("c0f672d4", 16)
// returns -1057590572

如何使用 PHP 5.3+ 为 32 位和 64 位获得相同的返回值?

我想它可能需要pack/unpack 函数和bitwise operators 的组合,但还没有找到合适的组合。

更新:2013-07-10 以下适用于 32 位系统:

$str = 'c0f672d4';
$int = intval( substr( $str, 0, 4 ), 16 ); // read high 16 bit word
$int <<= 16; // shift hi word correct position
$int |= intval( substr( $str, 4, 4 ), 16 ); //  read low 16 bit word
echo $int;
// returns -1057590572

上面的问题是它在 64 位系统上不起作用。相反,我使用上面的 PHP 代码得到了 3237347344 的值。

有什么想法可以使用可移植到 32 位和 64 位的 PHP 获得一致的整数?

【问题讨论】:

  • 上面的那个sn-p,虽然不会产生你想要的输出,但可以用hexdec替换

标签: c# php .net vb.net 32bit-64bit


【解决方案1】:

这目前在 32 位和 64 位系统上为我工作,YMMV。确保你测试,测试,测试!

信用:https://stackoverflow.com/a/2123458/

function intval_32bits($value)
{
    $value = ($value & 0xFFFFFFFF);
    if ($value & 0x80000000) $value = -((~$value & 0xFFFFFFFF) + 1);
    return $value;
}

【讨论】:

    【解决方案2】:

    您需要将 64 位二进制补码 +ve val 转换为 32 位二进制补码 -ve 值

    function to_int32($value) {
    
        $intval = hexdec($value);
    
        // If 64 bit
        if (PHP_INT_SIZE === 8) {
            return ($intval - 0x100000000);
        }
    
        // 32 bit
        return $intval;
    }
    

    【讨论】:

    • 我已经在 32 位和 64 位上进行了测试,它似乎可以正常工作。谢谢你。您是否有更多信息可以让我了解有关此修复/解决方案的更多信息?
    • 随后,我遇到了一些无法解决的边缘情况,因此我正在使用这两种解决方案进行更严格的测试:stackoverflow.com/a/2123458/156406stackoverflow.com/a/8130131/156406
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    相关资源
    最近更新 更多