如何在 PHP 中将字符串 '010101010' 转换为真正的二进制字符串

How to convert a string '010101010' into a real binary string, in PHP

我想将 IP 地址存储到 MySQL VARBINARY(16) 中。我将二进制地址作为字符串 '01001010010100101001010010100101'.

当我把它插入MySQL时。我意识到这不会自动转换。

在搜索 PHP 手册后,我很惊讶没有这个功能。

需要您的帮助,了解如何将二进制字符串转换为 VARBINARY

您可以通过组合函数 inet_ntoaconv 来完成此操作。

mysql> select inet_ntoa(conv('01001010010100101001010010100101',2,10));
+----------------------------------------------------------+
| inet_ntoa(conv('01001010010100101001010010100101',2,10)) |
+----------------------------------------------------------+
| 74.82.148.165                                            |
+----------------------------------------------------------+
1 row in set (0.00 sec)

此外,字符串结果可以转换为BINARY:

mysql> select CAST(inet_ntoa(conv('01001010010100101001010010100101',2,10)) AS BINARY);
+--------------------------------------------------------------------------+
| CAST(inet_ntoa(conv('01001010010100101001010010100101',2,10)) AS BINARY) |
+--------------------------------------------------------------------------+
| 74.82.148.165                                                            |
+--------------------------------------------------------------------------+
1 row in set (0.00 sec)

此外,这个 BINARY 字符串可以使用 UPDATEINSERT.

轻松放入 VARBINARY(16)

在PHP中,您可以使用bindeclong2ip将二进制字符串转换为IPv4地址:

bindec - Returns binary_string 参数表示的二进制数的十进制等效值。

long2ip - 将长整数地址转换为 (IPv4) Internet 标准点分格式的字符串

$ip_as_int = bindec('01001010010100101001010010100101');
$ipv4 = long2ip ( $ip_as_int );
echo $ipv4;

74.82.148.165

谢谢大家!但我认为我找到了更好的解决方案:6 年前有人在 PHP 手册页上发帖:

http://php.net/manual/en/function.pack.php#93085

<?php
function bin2bstr($input)
// Convert a binary expression (e.g., "100111") into a binary-string
{
  if (!is_string($input)) return null; // Sanity check

  // Pack into a string
  return pack('H*', base_convert($input, 2, 16));
}

function bstr2bin($input)
// Binary representation of a binary-string
{
  if (!is_string($input)) return null; // Sanity check

  // Unpack as a hexadecimal string
  $value = unpack('H*', $input);

  // Output binary representation
  return base_convert($value[1], 16, 2);
}

// Returns string(3) "ABC"
var_dump(bin2bstr('01000001 01000010 01000011'));

// Returns string(24) "010000010100001001000011"
var_dump(bstr2bin('ABC'));
?>