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)]; 
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值