#前書き
あまり具体的なPHPでのチェックサム(XOR)の実装方法の記事がなかったので記録も兼ねて作成してみました。
実行速度がより速い方法は色々あると思いますので、あくまで参考程度にしてください。
#実装
$data = "対象文字列";
$binary_data = bin2hex($data); //文字列をバイナリデータ(16進数)に変換
$binary_array = str_split($binary_data, 2); //バイナリデータを2bit毎に分ける
foreach($binary_array as $key => $binary) {
if($key === 0) {
$check_sum_first = sprintf('%08d', decbin(hexdec($binary))); //16進数⇒10進数⇒2進数(0左詰めの8bit)
continue;
}
$check_sum_second = sprintf('%08d', decbin(hexdec($binary)));
// 1bitずつ排他的論理和(xor)を求める
for($i = 0, $i < strlen($check_sum_first), $i++) {
$check_sum_first[$i] = intval($check_sum_first[$i]) ^ intval($check_sum_second[$i]);
}
}
//2進数⇒10進数⇒16進数⇒デコード処理
$check_sum = hex2bin(dechex(bindec($check_sum_first)));
#後書き
実装見てわかる通り、泥臭いやり方をしています。
文字列を16進数に変換後、2bit毎に配列に分けて2進数(8bit)に変換してから1bit毎に排他的論理和を求めています。
実際に正しくチェックサムの結果が出てるかどうかはツール等を使わないとわからないので
バイナリエディターやXOR算出ツールなどを利用して確認してみてください。