2013-07-09 72 views
1

我正在寻找一种简洁的方式将8个字符的字符串转换为32位有符号整数。.NET Framework中Convert.ToInt32的PHP等效代码

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

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

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

如何使用PHP 5.3+同时为32位和64位,我得到相同的回报价值?

我想它可能需要pack/unpack功能和bitwise operators的组合但尚未找到正确的组合。

更新时间:2013年7月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

任何想法获得一个一致的整数与PHP可移植的32位和64位?

+0

那上面的代码中,虽然不会产生我在32位和64位,并测试这个输出,你可以用hexdec –

回答

1

目前这个工作对我来说在32位和64位系统,情况因人而异。确保你测试,测试,测试!

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

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

你需要从64位二进制补码转换+已经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; 
} 
+0

更换后是似乎正在工作。谢谢。你有更多的信息,我可以在这个修补程序/解决方案阅读更多信息? – paperclip

+0

随后,我遇到了一些边缘案例,没有解决,所以我正在做一些更严格的测试这两个解决方案: http://stackoverflow.com/a/2123458/156406 http:///stackoverflow.com/a/8130131/156406 – paperclip