UTF8编码的Base64解密 MSSQL实现
GO CREATE FUNCTION [dbo].[c_GetUTF8Code]
(
@char Nchar
)
RETURNS int
AS --UTF8转码
BEGIN
Declare @Code int
Select @Code=Cast(Unicode(@char) as int)
Declare @Utf8Code int
Set @Utf8Code=0
if(@Code<128)
begin
--0-127
--0000-007F
--0xxxxxxx
--01100010 Unocide
--01100010 UTF-8
Set @Utf8Code=@Code
end
else if(@Code>127 and @Code<2048)
begin
--128-2047
--0080-07FF
--110xxx xx10xx xxxx
--110 7 F F
Declare @C1 int
Declare @C2 int
Declare @C3 int
Select @C1=@Code/0x100
Select @C2=(@Code%0x100)/0x10
Select @C3=@Code%0x10
Select @Utf8Code=0xC080+0x400*@C1+0x100*(@C2/4)+0x10*(@C2%4)+@C3
end
else if(@Code>2047 and @Code<65536)
begin
--2047-65535
--0110 0010 0001 0001
--1110 xxxx 10xx xxxx 10xx xxxx
--1110 0110 1000 1000 1001 0001
Declare @C11 int
Declare @C12 int
Declare @C13 int
Declare @C14 int
Select @C11=@Code/0x1000
Select @C12=(@Code%0x1000)/0x100
Select @C13=(@Code%0x100)/0x10
Select @C14=@Code%0x10
Select @Utf8Code=0xE08080+0x10000*@C11+0x400*@C12+0x100*(@C13/4)+0x10*(@C13%4)+@C14
end
return @Utf8Code
End GO CREATE FUNCTION [dbo].[base64_utf8encode]
(
@plain_text varchar(max)
)
RETURNS varchar(max)
AS BEGIN --Base64解密
DECLARE @output varchar(max)
DECLARE @block_start integer
DECLARE @map char(64)
SET @map='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
SET @output=''
SET @block_start=0
Declare @plain_textLength int
Set @plain_textLength=Len(@plain_text)
Declare @RestTransfer int--转码数累积
Declare @RestTransferLenth int
Set @RestTransfer=0
Set @RestTransferLenth=0
Declare @CodeInt int
Declare @block_val BINARY(3)
WHILE @block_start<@plain_textLength
BEGIN
Set @CodeInt=0
SELECT @CodeInt= [dbo].[c_GetUTF8Code](SubString(@plain_text,@block_start+1,1))
Declare @CodeTransfer int
Set @CodeTransfer=0
--0-127 1位
--128-2047 2位
--2047-65535 3位
if(@CodeInt<128)
begin
--+1位
if(@RestTransferLenth=0 or @RestTransferLenth=1)
begin
Set @RestTransfer=@RestTransfer*0x100+@CodeInt
Set @RestTransferLenth=@RestTransferLenth+1
end
else if(@RestTransferLenth=2)
begin
Set @CodeTransfer=@RestTransfer*0x100+@CodeInt
Set @RestTransfer=0
Set @RestTransferLenth=0
end
end
else if(@CodeInt>127 and @CodeInt<2048)
begin
--+2位
if(@RestTransferLenth=0)
begin
Set @RestTransfer=@CodeInt
Set @RestTransferLenth=2
end
else if(@RestTransferLenth=1)
begin
Set @CodeTransfer=0x10000*@RestTransfer+@CodeInt
Set @RestTransfer=0
Set @RestTransferLenth=0
end
else if(@RestTransferLenth=2)
begin
Set @CodeTransfer=0x100*@RestTransfer+@CodeInt/0x100
Set @RestTransfer=@CodeInt%0x100
Set @RestTransferLenth=1
end
end
else if(@CodeInt>2047)
begin
--+3位
if(@RestTransferLenth=0)
begin
Set @CodeTransfer=@CodeInt
Set @RestTransfer=0
Set @RestTransferLenth=0
end
else if(@RestTransferLenth=1)
begin
Set @CodeTransfer=0x10000*@RestTransfer+@CodeInt/0x100
Set @RestTransfer=@CodeInt%0x100
Set @RestTransferLenth=1
end
else if(@RestTransferLenth=2)
begin
--剩余部分十六进制右移两位与新数据前两位之和
Set @CodeTransfer=0x100*@RestTransfer+@CodeInt/0x10000
Set @RestTransfer=@CodeInt%0x10000
Set @RestTransferLenth=2
end
end
---累积到3位,执行加密转换
if(@CodeTransfer>0x100000)
begin
SET @block_val = CAST(@CodeTransfer AS BINARY(3))
SET @output = @output
+ SUBSTRING(@map , @block_val/262144 +1,1)
+ SUBSTRING(@map ,(@block_val/4096&63)+1,1)
+ SUBSTRING(@map ,(@block_val/64 &63)+1,1)
+ SUBSTRING(@map ,(@block_val&63) +1,1)
end
SET @block_start=@block_start+1
END
IF @RestTransferLenth>0
BEGIN SET @block_val=Cast(@RestTransfer*(Case @RestTransferLenth When 1 Then 65536 Else 256 end) as BINARY(3))
SET @output=@output
+SUBSTRING(@map , @block_val/262144+1, 1)
+SUBSTRING(@map ,(@block_val/4096 &63)+1,1)
+CASE WHEN @RestTransferLenth =1
THEN REPLACE(SUBSTRING(@map ,(@block_val/64&63)+1,1),'A','=')
ELSE SUBSTRING(@map ,(@block_val/64&63)+1,1)
END
+CASE WHEN @RestTransferLenth=1
THEN '='
ELSE REPLACE(SUBSTRING(@map ,(@block_val&63)+1,1),'A','=')
END
END
RETURN @output
END GO CREATE FUNCTION [dbo].[base64_utf8decode]
(
@encoded_text varchar(max)
)
RETURNS varchar(max)
AS BEGIN --BASE64加密
DECLARE @output varchar(max)
DECLARE @block_start int
DECLARE @encoded_length int
DECLARE @decoded_length int
DECLARE @mapr binary(122)
SET @output = ''
SET @mapr =
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -- 1-33
+0xFFFFFFFFFFFFFFFFFFFF3EFFFFFF3F3435363738393A3B3C3DFFFFFF00FFFFFF -- 33-64
+0x000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF -- 65-96
+0x1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233-- 97-122
SET @encoded_length=LEN(@encoded_text)
SET @decoded_length=@encoded_length/4*3
SET @block_start=1
Declare @Code int
Set @Code=0
Declare @CodeLength int--累计连接数,1,2,3
Set @CodeLength =0
WHILE @block_start<@encoded_length
BEGIN
Declare @Integer Integer
Set @Integer=substring(@mapr,Unicode(substring(@encoded_text,@block_start ,1)),1)*262144
+ substring(@mapr,Unicode(substring(@encoded_text,@block_start+1,1)),1)*4096
+ substring(@mapr,Unicode(substring(@encoded_text,@block_start+2,1)),1)*64
+ substring(@mapr,Unicode(substring(@encoded_text,@block_start+3,1)),1)
Declare @C1 int
Declare @C2 int
Declare @C3 int
--0xFF FF FF
Set @C1=@Integer/0x10000
Set @C2=(@Integer/0x100)%0x100
Set @C3=@Integer%0x100
-------------------------------------@C1
if(@C1<0x80)
begin
if(@CodeLength=2)
begin
--128-2047
--0080-07FF
--110x xx xx 10xx xxxx
Set @Code=((@Code%0x2000)/0x100)*0x10+@Code%0x40
SET @output=@output+NCHAR(@Code)
--print @Code
Set @Code=0
Set @CodeLength=0
end
SET @output=@output+CAST(Cast(@C1 AS BINARY(1))AS VARCHAR(1))
end
else
begin
--码字连接
Set @Code=@Code*0x100+@C1
SET @CodeLength=@CodeLength+1
if(@CodeLength=3)
begin
--0110 0010 0001 0001
--1110 xxxx 10xx xxxx 10xx xxxx
--1110 0110 1000 1000 1001 0001
Set @Code=((@Code%0x100000)/0x10000)*0x1000+((@Code%0x4000)/0x100)*0x40+@Code%0x40
SET @output=@output+NCHAR(@Code)
Set @Code=0
Set @CodeLength=0
end
end
-------------------------------------@C2
if(@C2<0x80)
begin
if(@CodeLength=2)
begin
--128-2047
--0080-07FF
--110x xx xx 10xx xxxx
Set @Code=((@Code%0x2000)/0x100)*0x10+@Code%0x40
SET @output=@output+NCHAR(@Code)
--print @Code
Set @Code=0
Set @CodeLength=0
end
SET @output=@output+CAST(Cast(@C2 AS BINARY(1))AS VARCHAR(1))
end
else
begin
--码字连接
Set @Code=@Code*0x100+@C2
SET @CodeLength=@CodeLength+1
if(@CodeLength=3)
begin
--0110 0010 0001 0001
--1110 xxxx 10xx xxxx 10xx xxxx
--1110 0110 1000 1000 1001 0001
Set @Code=((@Code%0x100000)/0x10000)*0x1000+((@Code%0x4000)/0x100)*0x40+@Code%0x40
SET @output=@output+NCHAR(@Code)
Set @Code=0
Set @CodeLength=0
end
end
-------------------------------------@C3
if(@C3<0x80)
begin
if(@CodeLength=2)
begin
--128-2047
--0080-07FF
--110x xx xx 10xx xxxx
Set @Code=((@Code%0x2000)/0x100)*0x10+@Code%0x40
SET @output=@output+NCHAR(@Code)
--print @Code
Set @Code=0
Set @CodeLength=0
end
SET @output=@output+CAST(Cast(@C3 AS BINARY(1))AS VARCHAR(1))
end
else
begin
--码字连接
Set @Code=@Code*0x100+@C3
SET @CodeLength=@CodeLength+1
if(@CodeLength=3)
begin
--0110 0010 0001 0001
--1110 xxxx 10xx xxxx 10xx xxxx
--1110 0110 1000 1000 1001 0001
Set @Code=((@Code%0x100000)/0x10000)*0x1000+((@Code%0x4000)/0x100)*0x40+@Code%0x40
SET @output=@output+NCHAR(@Code)
Set @Code=0
Set @CodeLength=0
end
end
SET @block_start = @block_start + 4
END
IF RIGHT(@encoded_text,2)='=='
SET @decoded_length=@decoded_length-2
ELSE IF RIGHT(@encoded_text,1)='='
SET @decoded_length=@decoded_length-1
RETURN LEFT(@output ,@decoded_length)
END

UTF8编码的Base64解密 MSSQL实现的更多相关文章
- Unicode字符集,utf8编码,base64编码简单了解
Unicode字符集,utf8编码,base64编码简单了解 Unicode字符集,ASCII,GB2312编码集合等,类似于不同的字典,不同的字符的编码,类似于字典中的字在哪一个页哪一排. 当不同系 ...
- php和js中,utf-8编码转成base64编码
1.php下转化base64编码 php中,文本文件的编码决定了程序变量的编码,比如以下代码在不同编码的php文件中,展示的效果也是不一样的 <?php $word = '严'; echo ba ...
- javascript中的Base64.UTF8编码与解码详解
javascript中的Base64.UTF8编码与解码详解 本文给大家介绍的是javascript中的Base64.UTF8编码与解码的函数源码分享以及使用范例,十分实用,推荐给小伙伴们,希望大家能 ...
- js base64加密与C#后台base64解密
js代码 function encode64(input) { var output = ""; var base = new Base64(); var output = bas ...
- 编码之Base64编码
Base64编码 是一种基于 64 个可打印字符来表示二进制数据的方法.目前 Base64 已经成为网络上常见的传输 8 位二进制字节代码的编码方式之一. 为什么会有 Base64 编码呢?因为有些网 ...
- 编码,加解密,签名,Hash
工作中会听到各种各样是是而非的词汇,base64,url,sha256,rsa,hash等等,你能很好的分清这些词语吗? 这次我想把它们统一的整理说明下: 一: 编码 编码是信息从一种形式或格式转换为 ...
- 刨根究底字符编码之十一——UTF-8编码方式与字节序标记
UTF-8编码方式与字节序标记 一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基 ...
- URL编码和Base64编码 (转)
我们经常会遇到所谓的URL编码(也叫百分号编码)和Base64编码. 先说一下Bsae64编码.BASE64编码是一种常用的将二进制数据转换为64个可打印字符的编码,常用于在通常处理文本数据 ...
- base64解密
问题 : base64解密 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个 ...
随机推荐
- SVN备份还原
本文是对SVN备份还原的一个简单记录 /*千万不能用VisualSVN Server PowerShell,否则在还原Load的时候会发生错误E140001,具体参考http://stackoverf ...
- v4l2文档之——color and format【转】
转自:https://blog.csdn.net/zoe6553/article/details/17715407 v4l2文档第五A--颜色与格式 颜色与格式这是不定期发布的关于写视频驱动程序 ...
- c++ 引用方式传递数组
值传递 (pass by value),指针传递(pass by pointer),当发生函数调用时,需要给形参分配存储单元.当传递是对象时,要调用拷贝构造函数.而且指针最后析构时,要处理内存释放问题 ...
- 企业内部在centos7.2系统中必杀技NTP时间服务器及内网服务器时间同步(windows和linux客户端同步)
网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议.NTP的用途是把计算机的时间同步到某些时间标准.目前采用的时间标准是世界协调时UTC(Unive ...
- rsa加密解密, 非对称加密
2016年3月17日 17:21:08 星期四 现在越来越懒了.... 参考: http://www.xuebuyuan.com/1399981.html 左边是加密流程, 右边是解密流程 呃...有 ...
- 转载:2.2 Nginx配置的通用语法《深入理解Nginx》(陶辉)
原文:https://book.2cto.com/201304/19625.html Nginx的配置文件其实是一个普通的文本文件.下面来看一个简单的例子.user nobody; worker_p ...
- Oracle数据库常用Sql语句大全
一,数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSE ...
- Mac下brew安装与配置mysql
一.打开mac控制台 $ brew install mysql 二.启动mysql服务 $ mysql.server start 三.初始化mysql配置 1 rainMacBook-Pro:~ co ...
- php中foreach()跳出循环或者终止循环的实现方法
$arr = array('a','b','c','d','e'); $html = ''; foreach($arr as $key => $value){ if($value=='b'){ ...
- python 全栈开发,Day6(is,小数据池,编码转换)
一.is a = 100 b = 100 print(a == b) print(a is b) 执行输出: TrueTrue 查看内存地址,使用id函数 print(id(a)) print(id( ...