Я хочу хранить IP-адреса в MySQL VARBINARY(16)
, У меня есть двоичный адрес в виде строки '01001010010100101001010010100101'
,
Когда я вставляю это в MySQL. Я понимаю, что это не будет преобразовано автоматически.
После поиска руководства по PHP я удивляюсь, что для этого нет функции.
Нужна ваша помощь в том, как преобразовать двоичную строку в VARBINARY
,
В PHP вы можете использовать bindec
а также long2ip
преобразовать двоичную строку в адрес IPv4:
BinDec — Возвращает десятичный эквивалент двоичного числа, представленного аргументом binary_string.
long2ip — Преобразует длинный целочисленный адрес в строку в стандартном точечном формате (IPv4).
$ip_as_int = bindec('01001010010100101001010010100101');
$ipv4 = long2ip ( $ip_as_int );
echo $ipv4;
74.82.148.165
Спасибо вам всем! Но я думаю, что нашел лучшее решение: кто-то опубликовал на странице справки по PHP 6 лет назад:
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'));
?>
Вы можете сделать это, комбинируя функции inet_ntoa
а также conv
,
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
Строка может быть легко вставлена в VARBINARY(16)
столбец с использованием UPDATE
или же INSERT
,