将1和0的数组转换为二进制变量

问题描述:

我正在PHP中编写一个应用程序,它需要采用任意长度的1和0的数组并将其转换为二进制变量(存储在MySQL BINARY字段中)。我也需要一个功能来扭转这个过程。将1和0的数组转换为二进制变量

我想用什么来结束:

$bits = array(0,1,0,1,1,1,0,1); 
$bin = bits2bin($bits); 

bin2hex($bin); // returns "5D" 

$bits = bin2bits($bin); // = array(0,1,0,1,1,1,0,1); 

我写了下面的两个函数,这工作我的需求:

function bits2bin($bits) { 
    $binarystring = implode($bits); 
    $bytes = str_split($binarystring, 8); 
    $hexstring = ''; 
    foreach($bytes as $byte) { 
     $hexbyte = dechex(bindec($byte)); 
     $hexbyte = str_pad($hexbyte, 2, "0", STR_PAD_LEFT); 
     $hexstring .= $hexbyte; 
    } 
    return $binary = pack('H*', $hexstring); 
} 

function bin2bits($binary) { 
    $hexbytes = unpack('H*', $binary); 
    $bits = array(); 
    foreach(str_split($hexbytes[1], 2) as $hexbyte) { 
     $hexbyte = decbin(hexdec($hexbyte)); 
     $hexbyte = str_pad($hexbyte, 8, "0", STR_PAD_LEFT); 
     foreach(str_split($hexbyte) as $bit) { 
      $bits[] = $bit; 
     } 
    } 
    return $bits; 
} 

数组应该能够是任何长度(例如3比特,8比特或10,000比特),但如果这使得事情变得更容易,则可以仅限于整个字节。

有没有一种更优雅/有效的方式来做到这一点?

+0

根据[MySQL的网页(https://dev.mysql.com/doc/refman/5.7/en/binary-varbinary.html)*的BINARY和VARBINARY类型类似于CHAR和VARCHAR,只是它们包含二进制字符串而不是非二进制字符串*所以简单的'implode'和'str_split'应该可以工作。 – apokryfos

+0

如果我更新表设置binfield ='01011101''(binfield是BINARY 16)我回来了'0x30313031313130310000000000000000' 我可以用'update table set binfield = b'01011101''做到,但只能解决一半问题,并且只能用于插入MySQL。我仍然想在PHP中使用二进制变量。 –

+0

你只是想将'$ bits = array(0,1,0,1,1,1,0,1);'到'5d'的位数组转换为 –

试试这个:

function bits2bin($bits) { 
    return implode(array_map(function ($v) { return chr(bindec(implode($v))); }, array_chunk($bits,8))); 
} //Will return the binary string which corresponds to those bits (hopefully) you can alternatively cast them in MySQL. 

function bin2bits($binary) { 
     return str_split(base_convert(unpack("H*",$binary)[1],16,2)); 
} 
+0

你的bin2bits函数正在为我的16字节测试数据返回64个零的数组 - 而我的函数返回128(正确的位为1和0)。我会仔细看看base_convert,因为它可能有帮助。 –