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实现的更多相关文章

  1. Unicode字符集,utf8编码,base64编码简单了解

    Unicode字符集,utf8编码,base64编码简单了解 Unicode字符集,ASCII,GB2312编码集合等,类似于不同的字典,不同的字符的编码,类似于字典中的字在哪一个页哪一排. 当不同系 ...

  2. php和js中,utf-8编码转成base64编码

    1.php下转化base64编码 php中,文本文件的编码决定了程序变量的编码,比如以下代码在不同编码的php文件中,展示的效果也是不一样的 <?php $word = '严'; echo ba ...

  3. javascript中的Base64.UTF8编码与解码详解

    javascript中的Base64.UTF8编码与解码详解 本文给大家介绍的是javascript中的Base64.UTF8编码与解码的函数源码分享以及使用范例,十分实用,推荐给小伙伴们,希望大家能 ...

  4. js base64加密与C#后台base64解密

    js代码 function encode64(input) { var output = ""; var base = new Base64(); var output = bas ...

  5. 编码之Base64编码

    Base64编码 是一种基于 64 个可打印字符来表示二进制数据的方法.目前 Base64 已经成为网络上常见的传输 8 位二进制字节代码的编码方式之一. 为什么会有 Base64 编码呢?因为有些网 ...

  6. 编码,加解密,签名,Hash

    工作中会听到各种各样是是而非的词汇,base64,url,sha256,rsa,hash等等,你能很好的分清这些词语吗? 这次我想把它们统一的整理说明下: 一: 编码 编码是信息从一种形式或格式转换为 ...

  7. 刨根究底字符编码之十一——UTF-8编码方式与字节序标记

    UTF-8编码方式与字节序标记 一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基 ...

  8. URL编码和Base64编码 (转)

    我们经常会遇到所谓的URL编码(也叫百分号编码)和Base64编码.      先说一下Bsae64编码.BASE64编码是一种常用的将二进制数据转换为64个可打印字符的编码,常用于在通常处理文本数据 ...

  9. base64解密

    问题 : base64解密 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个 ...

随机推荐

  1. Android避免OOM(内存优化)

    Android内存优化是性能优化很重要的一部分,而如何避免OOM又是内存优化的核心. Android内存管理机制 android官网有一篇文章 Android是如何管理应用的进程与内存分配 Andro ...

  2. 解决Centos下yum无法更新

    问题: http://mirrors.cloud.aliyuncs.com/epel/6/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 6 - ...

  3. SpringBoot注册Servlet、Filter、Listener

    SpringBoot默认是以jar包的方式启动嵌入式的Servlet容易来启动SpringBoot的Web应用,没有web.xml文件 因此我们可以使用以下方式来注册Servlet.Filter.Li ...

  4. 【网络编程1】网络编程基础-TCP、UDP编程

    网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...

  5. unicode 和 utf-8字符编码的区别

    作者:于洋链接:https://www.zhihu.com/question/23374078/answer/69732605来源:知乎著作权归作者所有,转载请联系作者获得授权.   原文:unico ...

  6. java linux ftp问题

    java写的ftp上传类,本地测试环境可以用,阿里云服务器不可用,两者系统均为centos.经过测试,发现appche的ftpclient类不可用,换成sun的ftpclient可以使用.

  7. java.lang.NoClassDefFoundError: com/google/inject/Injector

    报错如下: 解决方案: <dependency> <groupId>com.google.inject</groupId> <artifactId>gu ...

  8. MyEclipse2014安装插件的几种方式(适用于Eclipse或MyEclipse其他版本)

    农历 乙未 羊年 十一月初九 周六 2015年12月19日 14:29 编辑者:刘军 标题: 服务器的搭建请参考该文:<Win7 x64 svn 服务器搭建> ============== ...

  9. 测试开发之Django——No6.Django模板中的标签语言

    模板中的标签语言 1.if/else {% if  %} 标签检查(evaluate)一个变量,如果这个变量为真(即:变量存在,非空,不是布尔值假),系统会显示在{% if  %} 和 {% endi ...

  10. linux之nginx

    一.知识点回顾 临时:关闭当前正在运行的 /etc/init.d/iptables stop 永久:关闭开机自启动 chkonfig iptables off ll /var/log/secure # ...