伪Base32的构思和实现

最近看见了一个迅雷地址,发现将其转换为普通链接的工具后,发现所谓专用地址地址就是原地址前加一个表示迅雷的前缀,后进行Base64编码。查阅Base64编码过程后,突发奇想:能否做一个Base32算法?再查Base32,发现已经有具体的算法,而且比较复杂。于是,打算做一个山寨的Base32算法,这个算法相对于Base64算法有如下优点:

1.不会出现字节非3的整倍数而产生的补位填充问题。

2.实现简单,只要将高低位分区。

接下来开始构思。Encode部分问题不大,用一个low(0x0f)、high(0xf0)与原数进行与预算来区分高低位。0x0f转为二进制即为00001111,0xf0即为11110000。与low进行与运算会舍弃高位,与high进行与运算会舍弃低位,当然还需要右移4位。接下来就可以按照码表输出。而Decode部分花的时间较多,先是想到了顺序查找,需要大概32条运算,后想到了二分查找,运算只要4条(当然,这里都是往小了算),最后我考虑到了码表数据的单调性:码表中数据只可能是A-Z和2-7,所以只要简单做一下字符比较,区分字母和数字,最后进行ASCII运算即可,只要1条运算。为什么码表中数字选的是2-7而不是0-5呢?原因很简单,0容易和O混淆,1则容易和l混淆。

代码实现很简单,我也不注释了,直接贴出来吧,本程序的作用是把一个字符串转化为Base32编码后转回原字符串。当然,我考虑的较简单,本程序只能做到仅含有ASCII字符的字符串转化。

#include <iostream>
#include <string>
const char base32[]={‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,‘O‘,‘P‘,‘Q‘,‘R‘,‘S‘,‘T‘,‘U‘,‘V‘,‘W‘,‘X‘,‘Y‘,‘Z‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘};
const int Bin_high=0xf0;
const int Bin_low=0x0f;
using namespace std;
int get(const char);

int main(void){
    string Toencode;
    int hig=0,low=0;
    cin>>Toencode;
    //Encode
    char code[Toencode.length()*2+1];
    for (unsigned int i=0;i<Toencode.length();++i){
        hig=(Toencode[i]&Bin_high)>>4;
        low=Toencode[i]&Bin_low;
        code[i<<1]=base32[hig];
        code[(i<<1)+1]=base32[low];
    }
    code[Toencode.length()*2]=‘\0‘;
    cout<<code<<endl;
    //Decode
    for (unsigned i=0;i<Toencode.length()*2;i+=2){
        int nIA=get(code[i]);
        int nIB=get(code[i+1]);
        char deencode=(nIA<<4)+nIB;
        cout<<deencode;
    }
    return 0;
}
int get(const char n){
    if ((n>=‘A‘)and(n<=‘Z‘)){
        return (n-65);
    }
    return n-24;
}
时间: 2024-10-06 09:48:15

伪Base32的构思和实现的相关文章

前赴后继的净菜电商真只是伪需求?

据外媒报道,美国半成品净菜外卖平台独角兽Blue Apron (中文名"蓝围裙")在最近向纽约证交所提交了IPO招股书.作为一个外卖相关产业,净菜电商也算热门关注的领域,借Blue Apron上市的机会我们来谈谈净菜电商这一独特的电商模式. 据悉,Blue Apron成立于纽约布鲁克林,专门配送供2人或家庭的新鲜食材及不断更新的菜谱,供消费者烹饪使用.随着A轮融资的到位,Blue Apron在六个月内,就覆盖了密西西比州东部的所有城市.第二年在旧金山开设中央厨房,第三年在泽西市落成一家

CSS-用伪类制作小箭头(轮播图的左右切换btn)

先上学习地址:http://www.htmleaf.com/Demo/201610234136.html 作者对轮播图左右按钮的处理方法一改往常,不是简单地用btn.prev+btn.next的图片代替,而是用纯css制作. 第一个是left按钮,即prev: .vmc-arrow-left:after { content: "\e079"; } 第二个是right按钮的,也就是next下一张的按钮: .vmc-arrow-right:after { content: "\e

CSS3伪类实现动画旋转效果

一个简单的动画效果demo,keyframes为关键帧,图片贴在代码下方.利用了伪类实现css3动画效果,初学者可以看一下,恩.<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Keywords" content="关键词"> <meta name="D

基础知识--:before伪元素和:after伪元素

http://book.51cto.com/art/201108/285688.htm 3.7  替换指定位置 大家都知道before和after是前.后的意思.但是奇怪的是,CSS中的:before伪元素和:after伪元素是为源文档中不存在的内容设置样式的. 没有内容怎么设置样式呢?别急!它们有一个content属性,一起使用就可以为某个选择器前.后的内容设置样式了. 下面就来了解一下:before伪元素和:after伪元素的用法. 视频教学:光盘/视频/3/3.7  替换指定位置.avi 

CSS3特殊伪类::selection改变页面选中文字的样式

一般在网页上面,选中文字的时候,文字的样式是会改变的,当然,样式也都是千篇一律的浏览器的默认样式,蓝底白字,偶然看到有些网页上面当文字选中的时候会有不一样的样式,当时就很是好奇,后来才慢慢发现是css的一个伪类::selection ::selection是一个CSS3选择器(这也告诉这我们CSS3必须要去熟悉,这玩意确实可以弄出很多意想不到的好效果.) 兼容性:IE9+,Chrome,Opera,Safari,Firefox…(也可以去查看)caniuse.com#search=::selec

spark伪分布式安装与测试

1.下载scala2.11.5版本,下载地址为:http://www.scala-lang.org/download/2.11.5.html 2.安装和配置scala: 第一步:上传scala安装包 并解压 第二步 配置SCALA_HOME环境变量到bash_profile 第三步 source 使配置环境变量生效: 第四步 验证scala: 3.下载spark 1.2.0,具体下载地址:http://spark.apache.org/downloads.html 4.安装和配置spark: 第

CSS中的伪类和伪元素

伪类 伪类与类相似,但又没有类附加标签上.伪类分为UI伪类和结构化伪类. UI伪类 :link(将样式添加到未被访问的链接上) :visted(将样式已添加到访问的链接上) :hover(将样式添加到鼠标悬浮的元素上) :active(将样式添加到被激活的元素上) :focus(将样式添加到被选中的元素上) 结构化伪类 :first-child(将样式添加到第一个子元素上) :last-child(将样式添加到最后一个子元素上) 伪元素 伪元素是在文档中若有实无的元素. 主要有以下几种 :fir

关于css伪类的一些兼容性测试

测试环境:xp ,ie7~8  chrome. link 伪类 :(:link,:visited)  这个是链接专用 动态伪类 :(:hover,:active,:focus) <!DOCTYPE html> <html> <head></head> <style type="text/css"> a:link,input:hover{color:blue;} a:visited{color:green;} a:active{

Spark1.0.0伪分布安装指南

?一.下载须知 软件准备: spark-1.0.0-bin-hadoop1.tgz   下载地址:spark1.0.0 scala-2.10.4.tgz    下载下载:Scala 2.10.4 hadoop-1.2.1-bin.tar.gz   下载地址:hadoop-1.2.1-bin.tar.gz jdk-7u60-linux-i586.tar.gz  下载地址:去官网下载就行,这个1.7.x都行 二.安装步骤 hadoop-1.2.1安装步骤,请看: http://my.oschina.