本文主要是介绍Set1_Challenge1_Convert hex to base64,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Convert hex to base64
The string:
49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d
Should produce:
SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t
解题思路:
1. 以六个十六进制为一组;
2. 对每一组,拆分成三个字节;
3. 第一个字节通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符;
4. 然后将第一个字节与0x03(00000011)进行与(&)操作并左移4位,接着第二个字节右移4位与前者相或(|),即获得第二个目标字节;
5. 再将第二个字节与0x0f(00001111)进行与(&)操作并左移2位,接着第三个字节右移6位与前者相或(|),获得第三个目标字节;
6. 最后将第三个字节与0x3f(00111111)进行与(&)操作即获得第四个目标字节;
以下是PHP解法;
function HexToBase64($value){$container = array();for($i = 0; $i < strlen($value); $i = $i + 6) {if(($i + 6) > strlen($value) && $i < strlen($value)) { $container[] = substr($value, $i); } else {$container[] = substr($value, $i, 6); }}$result = array();foreach($container as $unit) {$result[] = Unit_convert($unit); }return implode("", $result);
}function Unit_convert($unit){$map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";$len = strlen($unit);$unit = base_convert($unit, 16 ,2);$unit = substr("0000000000000000000000" . $unit, -24);if($len == 2) {return $map[bindec($unit>>2)] .$map[bindec(($unit & 0x03)<<4)] ."=="; } else if($len == 4) {$unit_1 = bindec(substr($unit, 0, 8));$unit_2 = bindec(substr($unit, 8));return $map[($unit_1>>2)] .$map[(($unit_1 & 0x03)<<4) | ($unit_2>>4)] .$map[(($unit_2 & 0x0f)<<2)] ."="; } else if($len == 6) {$unit_1 = bindec(substr($unit, 0, 8));$unit_2 = bindec(substr($unit, 8, 8));$unit_3 = bindec(substr($unit, 16, 8));return $map[($unit_1>>2)] .$map[(($unit_1 & 0x03)<<4) | ($unit_2>>4)] .$map[(($unit_2 & 0x0f)<<2) | ($unit_3>>6)] .$map[($unit_3 & 0x3f)]; }
}
这篇关于Set1_Challenge1_Convert hex to base64的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!