php实现base64编码
工作需要,想弄一个加密的串,就想仿照base64的编码方式,写一个加密的方法,所以就有了下面这个用php实现的base64的代码
<?php
/**
* Base64 编码/解码
* @author liruixing
*/
class Base64{
private $_base64hash = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; /*这是Base64编码使用的标准字典*/
private $_DecodeTable = array( /* 这是php源码中使用的解码表,包含了256个字符对应的编码 */
-2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -2, -2, -1, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, -2, -2, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -2, -2, -2,
-2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, -2,
-2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
);
private $_encode_data = 0xfc0000;
private $_debug = false;
private $_encode_result = '';
public function encode($str) {
$len = strlen($str);
$num = 0;
$bin = 0;
$arr = array();
if($len >= 3) {
for($i=0;$i<$len;$i++) {
$bin = $bin << 8;
if($this->_debug) {
echo '$bin = ',decbin($bin),"\n";
echo 'binary = ', decbin(ord($str[$i])),"\n";
}
$bin = $bin | ord($str{$i});
if(($i+1)%3 == 0) {
$this->_encode_func($bin,3);
$bin = 0;
}
}
}
if($len%3 == 1) {
$bin = ord($str[$len-1]);
$bin = $bin << 4;
$this->_encode_func($bin,1);
$this->_encode_result .= '==';
} else if($len%3 == 2) {
$bin = ord($str[$len-2]);
$bin = $bin << 8;
$bin = $bin | ord($str[$len-1]);
$bin = $bin << 2;
$this->_encode_func($bin,2);
$this->_encode_result .= '=';
}
return $this->_encode_result;
}
private function _encode_func($bin,$bytes = 3) {
$num = 3;
$matches = 0;
$bits1 = ($num - $bytes) * 6;
$bits2 = $bytes * 6;
$matches = $this->_encode_data >> $bits1;
while( $matches ) {
$result = $bin & $matches;
$result = $result >> $bits2;
$bytes--;
$bits1 = ($num - $bytes) * 6;
$bits2 = $bytes * 6;
$matches = $this->_encode_data >> $bits1;
if($this->_debug) {
echo '$result = ',$result,' binary = ',decbin($result),"\n";
}
$this->_encode_result .= $this->_base64hash[$result];
}
}
public function decode($str) {
$bin = 0;
$length = strlen($str)-1;
$_decode_result = '';
$len = 0;
$i = 0;
while( ($len <= $length) ) {
$ch = $str[$len++];
if ($ch == '=') { // 当前一个字符是“=”号
/*
先说明一个概念:在解码时,4个字符为一组进行一轮字符匹配。
如果某一轮匹配的第二个是“=”且第三个字符不是“=”,说明这个带解析字符串不合法,直接返回空
*/
if ($str[$len] != '=' && (($i % 4) == 1)) {
return NULL;
}
continue;
}
$ch = $this->_DecodeTable[ord($ch)];
// 下面这连个条件,只有 ch < 0 会起作用,ch == -2 永远不会起作用,即所有不合法的字符均跳过。
if ($ch < 0 || $ch == -1) { /* a space or some other separator character, we simply skip over */
continue;
} else if ($ch == -2) {
return NULL;
}
switch($i % 4) {
case 0:
$bin = intval($ch) << 2;
break;
case 1:
$bin = intval($bin) | intval($ch) >> 4;
$_decode_result .= chr($bin);
$bin = ( intval($ch) & 0x0f ) << 4;
break;
case 2:
$bin = intval($bin) | intval($ch) >> 2;
$_decode_result .= chr($bin);
$bin = ( intval($ch) & 0x03 ) << 6;
break;
case 3:
$bin = intval($bin) | intval($ch);
$_decode_result .= chr($bin);
break;
}
$i++;
}
return $_decode_result;
}
public function debug($open = true) {
$this->_debug = $open;
}
}
上面有一个简单的debug开关,是刚开始写代码时自己调试用的,感觉还不错,就当是做个记录吧。
参考:
http://www.cnblogs.com/chengxiaohui/articles/3951129.html
php实现base64编码的更多相关文章
- URL安全的Base64编码
Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...
- Base64编码
Base64编码 写在前面 今天在做一个Android app时遇到了一个问题:Android端采用ASE对称加密的数据在JavaWeb(jre1.8.0_7)后台解密时,居然解密失败了!经过测试后发 ...
- Android数据加密之Base64编码算法
前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...
- 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希
据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...
- Base64编码【转】
转http://www.cnblogs.com/luguo3000/p/3940197.html 开发者对Base64编码肯定很熟悉,是否对它有很清晰的认识就不一定了.实际上Base64已经简单到不能 ...
- 【前端攻略】:玩转图片Base64编码
引言 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的 base64 编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的 base64 编码.标题略大,不过只是希望通过一些浅显 ...
- 为什么要用base64编码
1.需求 了解为什么要使用base64对数据编码 2.理由 因为传输二进制数据的时候,网络中间的有些路由会把ascii码中的不可见字符删了,导致数据不一致.一般也会对url进行base64编码 Whe ...
- 图片Base64编码
我们经常在做Jquery插件的时候需要插入一些自定义的控件,比如说按钮,而我们自己又觉着button标签很丑,而且不同浏览器显示的效果还不一样,这个时候我们需要用到图片,当然,我们可以通过img标签添 ...
- 浅析用Base64编码的图片优化网页加载速度
想必大家都知道网页加载的过程,从开始请求,到加载页面,开始解析和显示网页,遇到图片就再次向服务器发送请求,加载图片.如果图片很多的话,就会产生大量的http请求,从而影响页面的加载速度.所以现在有一种 ...
- Base64编码原理分析
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在了解Base64编码之前,先了解几个基本概念:位.字节. 位:"位(bit)"是计算机中最小的数据单位.每一位 ...
随机推荐
- c#基础语言编程-多态
语言中的多态性是为了使程序有扩展性,为实现多态性,在程序中体现为接口.抽象类.父类.具体类. 接口就是一种规范,解决了多重继承的问题,类似一种规范,告诉我要做什么,具有什么能力,在接口中定义写行为属性 ...
- 【Android - 框架】之Retrofit+RxJava的使用
前几天分别对Retrofit和RxJava进行了总结,这个帖子打算把Retrofit结合RxJava使用的方法总结以下.有还不了解Retrofit或RxJava的朋友可以参考下面的帖子学习~ [And ...
- Tomcat7.0.40 基于DataSourceRealm的和JDBCRealm的资源用户访问控制
软件版本: Tomcat 7.0.40 Mysql: 5.1 Host: CentOS 6.3 64bit 使用JDBCRealm (Tomcat 会使用所给的JDBC Connecter 自己去连M ...
- poj3348 Cows 凸包+多边形面积 水题
/* poj3348 Cows 凸包+多边形面积 水题 floor向下取整,返回的是double */ #include<stdio.h> #include<math.h> # ...
- Android 6.0 Changes
原文链接:http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html 伴随着新特性和功能,Andr ...
- xslt语法之---If Else
大家都知道,XSL中是没有if else的,那么要想实现if else该怎么办呢? 其实很简单 <xsl:choose> <xsl:when test="position( ...
- Java基础知识强化之集合框架笔记26:LinkedList的特有功能
1. LinkedList的特有功能: (1)添加功能 public void addFirst(Object e) public void addLast(Object e) ( ...
- Oracle数据库管理员经常使用的表和视图
◆dba_开头 dba_users 数据库用户信息 dba_segments 表段信息 dba_extents 数据区信息 dba_objects 数据库对象信息 dba_tablespaces 数据 ...
- node里如何查看浏览器信息
'use strict'; let http = require(`http`); http.createServer((req, res) => { console.log(req.heade ...
- U3D Trigger事件触发
使用Trigger事件触发,可以达到虽然触发了,可是不改变任何效果. 这个是进入时候触发的: void OnTriggerEnter2D(Collider2D other) { print (othe ...