伪Base16的构思和实现
最近看见了一个迅雷地址,发现将其转换为普通链接的工具后,发现所谓专用地址地址就是原地址前加一个表示迅雷的前缀,后进行Base64编码。查阅Base64编码过程后,突发奇想:能否做一个Base16算法?再查Base16,发现已经有具体的算法,而且比较复杂。于是,打算做一个山寨的Base16算法,这个算法相对于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混淆。
代码实现很简单,我也不注释了,直接贴出来吧,本程序的作用是把一个字符串转化为Base16编码后转回原字符串。当然,我考虑的较简单,本程序只能做到仅含有ASCII字符的字符串转化。
#include <iostream>
#include <string>
const char Base16[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P'};
const int Bin_high=0xf0;
const int Bin_low=0x0f;
using namespace std;
int get(const char); int main(void){
string Toencode;
int hig=,low=;
cin>>Toencode;
//Encode
char code[Toencode.length()*+];
for (unsigned int i=;i<Toencode.length();++i){
hig=(Toencode[i]&Bin_high)>>;
low=Toencode[i]&Bin_low;
code[i<<]=Base16[hig];
code[(i<<)+]=Base16[low];
}
code[Toencode.length()*]='\0';
cout<<code<<endl;
//Decode
for (unsigned i=;i<Toencode.length()*;i+=){
int nIA=get(code[i]);
int nIB=get(code[i+]);
char deencode=(nIA<<)+nIB;
cout<<deencode;
}
return ;
}
int get(const char n){
if ((n>='A')and(n<='Z')){
return (n-);
}
return n-;
}
伪Base16的构思和实现的更多相关文章
- 无线安全: 通过伪AP进行DHCP+DNS劫持的钓鱼攻击
有了之前学习802.11的数据帧格式.芯片硬件参数学习的基础后,我们接下来继续学习无线安全中黑客是怎样进行流量劫持攻击的 相关学习资料 http://www.freebuf.com/articles/ ...
- 【CSS进阶】伪元素的妙用--单标签之美
最近在研读 <CSS SECRET>(CSS揭秘)这本大作,对 CSS 有了更深层次的理解,折腾了下面这个项目: CSS3奇思妙想 -- Demo (请用 Chrome 浏览器打开,非常值 ...
- 伪共享(false sharing),并发编程无声的性能杀手
在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...
- 谈谈一些有趣的CSS题目(十)-- 结构性伪类选择器
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- Hbase的伪分布式安装
Hbase安装模式介绍 单机模式 1> Hbase不使用HDFS,仅使用本地文件系统 2> ZooKeeper与Hbase运行在同一个JVM中 分布式模式– 伪分布式模式1> 所有进 ...
- 【JavaScript】javascript中伪协议(javascript:)使用探讨
javascript:这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行. 比如下面这个死链接: <a href="javasc ...
- Hadoop伪分布式集群环境搭建
本教程讲述在单机环境下搭建Hadoop伪分布式集群环境,帮助初学者方便学习Hadoop相关知识. 首先安装Hadoop之前需要准备安装环境. 安装Centos6.5(64位).(操作系统再次不做过多描 ...
- Hadoop1 Centos伪分布式部署
前言: 毕业两年了,之前的工作一直没有接触过大数据的东西,对hadoop等比较陌生,所以最近开始学习了.对于我这样第一次学的人,过程还是充满了很多疑惑和不解的,不过我采取的策略是还是先让环 ...
- 架构设计:一种远程调用服务的设计构思(zookeeper的一种应用实践)
在深入学习zookeeper我想先给大家介绍一个和zookeeper相关的应用实例,我把这个实例命名为远程调用服务.通过对这种应用实例的描述,我们会对zookeeper应用场景会有深入的了解. 远程调 ...
随机推荐
- Java读取文件夹大小的6种方法及代码
(一)单线程递归方式 package com.taobao.test; import java.io.File; public class TotalFileSizeSequential { publ ...
- 实用Yii扩展
可以去官方搜索Yii扩展:Extensions | Yii PHP Framework http://www.yiiframework.com/extensions/?tag=tree Yii che ...
- A Tour of Go Structs
A struct is a collection of fields. (And a type declaration does what you'd expect.) package main im ...
- The Dangers of JavaScript’s Automatic Semicolon Insertion
Although JavaScript is very powerful, the language’s fundamentals do not have a very steep learning ...
- 在.net Core 中像以前那样的使用HttpContext.Current
今晚在学习.net Core 的使用 拿来以前项目进行改造最简单的问题就是怎么做到让httpcontext 和以前兼容 ,折腾的很久 终于搞定,纪录一下 .net core中使用了无处不在的注入,看了 ...
- 【转】C++的面象对象总结
转自:http://www.cnblogs.com/icemoon1987/archive/2012/10/01/2709572.html 1. 面向对象:对象.类.继承 2. 构造函数: 类的数 ...
- scala编程笔记(三)类,字段和方法
类,字段和方法 类是对象的蓝图,能够通过new来创建对象.在类的定义里能够有字段和方法.统称member val还是var都是指向对象的变量(var定义的字段可又一次赋值),def定义方法,包括可运行 ...
- [Whole Web] [AngularJS] Localize your AngularJS Application with angular-localization
It is best to start your application's localization efforts early in development, even if you only s ...
- VS C# 快捷键
解决VS2010中工具箱的的不见的问题:按快捷键Ctrl+Alt+X 全屏:Shift+Alt+Enter注释选定内容:Ctrl+E+C/Crtr+E+U代码格式化:ctrl+E+F ======== ...
- JS问题Uncaught ReferenceError:XXXX is not defined
背景: html中一个table,table中进行分页.每行后面有一系列操作,如删除,修改.现在以删除为例说明问题. 实现方式: 使用button,在onclick中调用js函数,js函数中传递参数如 ...