2016-03-29 29 views
2

IP adreslerini MySQL VARBINARY(16) içine kaydetmek istiyorum. İkili adresi '01001010010100101001010010100101' dizesi olarak kullanıyorum.'010101010' dizgisini gerçek bir ikili dizgeye dönüştürmek için nasıl PHP

Bunu MySQL'e yerleştirdiğimde. Bunun otomatik olarak dönüştürülmeyeceğini biliyorum.

PHP el kitabında arama yaptıktan sonra bunun için bir işlev olmadığına şaşırdım.

İkili dizgiyi VARBINARY'a dönüştürme konusunda yardıma ihtiyacınız var.

cevap

0

Teşekkür hepinizi bir uzun tamsayı adresi dönüştürür! Ama daha iyi bir çözüm buldum: Birisi 6 yıl önce PHP manuel sayfada yayınlanmıştır:

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')); 
?> 
+0

Üzgünüm. İçerik orijinal URL’den kopyalandı. – Walkinraven

-1

Bunu, inet_ntoa ve conv işlevlerini birleştirerek yapabilirsiniz.

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) 

üzerinde fazla, dize sonucu BINARY dönüştürülebilir:

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) 

Ayrıca, bu BINARY dize kolayca kullanarak VARBINARY(16) sütuna UPDATE veya INSERT bir konabilir.

+0

IP adresinin ikili gösterimi sonucudur? Sonuç varbin değer mi? – Pred

0

PHP size IPv4 adresine ikili dize dönüştürmek için bindec ve long2ip kullanabilirsiniz:

bindec - binary_string argüman tarafından temsil ikili sayının ondalık eşdeğerini döndürür.

long2ip - (IPv4) İnternet standardı noktalı biçimde bir dize içine

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

74.82.148.165