PHP实现Base16编码算法
我们经常使用的 Base64 编码用来对字符串或者字节数组进行编码转换,以方便存储。可是Base64 编码的结果可能会带有特殊字符,应用场景有限。
而 Base16 编码生成的结果是用[0-9A-F]十六个字符表示,可以用来生成字符索引和文件名等,应用范围比 Base64 要大的多。
缺点的话 Base16 编码的结果字符串比 Base64 编码的结果字符串要长, Base64 大概是1.3倍长,而 Base16 是原长度的两倍。
Base16 编码的原理是先获取字符串每个字节的二进制值,高位用0补充到8位。然后每4比特分割成一组,每组的二进制值转换成十进制,然后再对应到[0-9A-F],对应的结果就是编码的值。
PHP 官方并没有 Base16 的编码实现,使用下面的函数就可以实现Base16的编码和解码。
function base16_encode($string) { $encode = ''; $chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']; for ($i = 0; $i < strlen($string); $i++) { $encode .= $chars[(ord($string[$i]) & 0b11110000) >> 4] . $chars[ord($string[$i]) & 0b00001111]; } return $encode; } function base16_decode($encode) { $result = ''; for ($i = 0; $i < strlen($encode) / 2; $i++) { $result .= chr(intval(substr($encode, $i * 2, 2), 16)); } return $result; }