2012-08-14 116 views
4

我在與轉換二進制字符串符號整數PHP:符號二進制字符串

一個問題,如果你調用decbin(「 - 40」),PHP將輸出1111111111111111111111111111111111111111111111111111111111011000

但是,如果你調用bindec( decbin(' - 40')),它會輸出1.84467440737E + 19(或類似的東西,顯然不是-40),因爲它「把最重要的位看作另一個數量級而不是符號位」。手冊

有沒有辦法將一個二進制64位二進制字符串(非常像decbin輸出)轉換成一個字符串有符號整數?

+0

嘗試使用base_convert函數。 – Niloct 2012-08-14 06:24:24

+0

看到這個評論:http://docs.php.net/manual/da/function.bindec.php#79072 – complex857 2012-08-14 06:35:09

回答

1

從文檔,您不能使用bindec

bindec()解釋所有binary_string值作爲無符號整數。這是因爲bindec()將最重要的位視爲另一個數量級而不是符號位。

base_convert似乎完全忽略了簽名。

如果你知道你的到來串永遠是64位二進制,你在32位系統上不,它很容易編寫自定義的功能。

  • 檢查字符串是否是64個字符長。
  • 檢查最顯著位是1
  • 翻轉所有位
  • 添加1
  • 取反

這裏有一個快速的一個我敲了起來。

function bindec2($bin) 
{ 
    if (strlen($bin) == 64 && $bin[0] == '1') { 
     for ($i = 0; $i < 64; $i++) { 
      $bin[$i] = $bin[$i] == '1' ? '0' : '1'; 
     } 

     return (bindec($bin) + 1) * -1; 
    } 
    return bindec($bin); 
} 
+0

謝謝!這就像一個魅力!我所擁有的數據實際上被最小化以節省空間,並且我額外填充了1或0來實際上使其長64位 - 而且系統是64位系統,所以我不認爲我會通過刪除長度檢查。 – user1481075 2012-08-14 06:45:00

0

使用packunpack在int和二進制字符串之間進行轉換。

// 'i' means signed integer 
var_dump(unpack('i', pack('i', '-40'))); // gives you -40 
+0

我沒有使用-40我的朋友的豪華,我有的數據是格式輸出bindec – user1481075 2012-08-14 06:39:15