2017-04-05 11 views
1

PHPでアプリケーションを作成しています。これは、任意の長さの1と0の配列をとり、バイナリ変数に変換する必要があります(MySQL BINARYフィールド)。このプロセスを逆にする関数も必要です。配列は任意ですることができるはず1と0の配列をバイナリ変数に変換する

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; 
} 

:私は私のニーズに合わせて、以下の二つの機能、作業を書かれている

$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); 

:私はで終わるしたいのですがどのような

長さ(例えば、3ビット、8ビット、または10,000ビット)であるが、これによりバイト全体が制限される可能性がある。

もっとエレガントで効率的な方法がありますか?

+0

を単純な 'implode'と' str_split'が動作するはずです。*これらは、バイナリ文字列ではなくバイナリ文字列を含んでいる点を除いて、CHARとVARCHARに似ています。 – apokryfos

+0

'update table set 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'に変換したいだけですか –

答えて

0

このお試しください:BINARYとVARBINARYタイプ* [MySQLのページ](https://dev.mysql.com/doc/refman/5.7/en/binary-varbinary.html)によると

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個の0の配列を返していますが、私の関数は128個(正しいビットを1とゼロとして返す)です。 base_convertを参考にしてより詳しく見ていきます。 –

関連する問題