3

我试图(在 PHP 中)读取两个字节(16 位)的二进制补码值并返回一个带符号的十进制。

我不确定两者的恭维数学应该如何工作,但是从 php.net,我设法得到它几乎可以显示我的期望。我认为我遇到的问题是我没有得到任何负值。

我有的代码:

function _bin16dec($bin) {
    // Function to convert 16bit binary numbers to integers using two's complement
    $num = bindec($bin);
    if($num > 0xFFFF) { return false; }
    if($num >= 0x8000) {
        return -(($num ^ 0xFFFF)+1);
    } else {
        return $num;
    }
}

这段代码是网上有人想出来的,但是在python里面看不懂。

def twoscomp( x ) :
   "This returns a 16-bit signed number (two's complement)"
   if (0x8000 & x): 
   x = - (0x010000 - x)
return x

应用程序以 2 的补码形式从陀螺仪读取每个轴的两个字节。

提前致谢!

山姆

4

2 回答 2

5

假设这个 Python 函数符合您的预期......

def twoscomp( x ) :
    """This returns a 16-bit signed number (two's complement)"""
    if (0x8000 & x): 
        x = - (0x010000 - x)
    return x

...这个 PHP 函数应该做同样的事情。

function _bin16dec($bin) {
    // converts 16bit binary number string to integer using two's complement
    $num = bindec($bin) & 0xFFFF; // only use bottom 16 bits
    if (0x8000 & $num) {
        $num = - (0x010000 - $num);
    }
    return $num;
}

此代码适用于我在 PHP 5.3.15 上。如果您需要进一步的解释,请告诉我。
--ap

于 2013-04-21T03:53:51.957 回答
0

这是 ec-2 Amazon Linux x64 发行版 PHP 5.3.27 的一个版本,它可以转换 32 位二进制字符串:

function _bin32dec($bin) {
  $num = bindec($bin) & 0xFFFFFFFF;
  if (0x80000000 & $num) {
    $num = - (0xFFFFFFFF - $num + 1);
  }
  return $num;
}
于 2014-04-22T09:55:28.840 回答