使用 T-SQL 实现 base64 解码

原创 2009年02月19日 14:46:00

IF OBJECT_ID(N'dbo.f_base64_decode') IS NOT NULL

    DROP FUNCTION dbo.f_base64_decode;

GO

/*-- == base64 解码=================================

    SQL Server 中,使用FOR XML 生成xml 实例时,binary 数据

使用base64 编码,而解释xml 的时候,却没有相应的解码方法。

    使用此函数可以解决这个问题

   

    Base64 编码把个位字节(*8=24)转化为个位的字节(*6=24

之后在位的前面补两个,形成位一个字节的形式。用下面的个字符重新

表示:“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”

    如果输入的数据的长度不是的倍数,则编码结果的不足部分用等号“=”

补足。

 

---------------------------------------------------------

-- 调用示例

 

    SELECT -- 还原成字符串

       v1 = CONVERT(varchar(max), v1),

       v2 = CONVERT(nvarchar(max), v2)

    FROM(

       SELECT  -- 解码base64 编码

           v1 = dbo.f_base64_decode(v1),

           v2 = dbo.f_base64_decode(v2)

       FROM(  -- 通过for xml 生成base64 编码

           SELECT

             v1 = (SELECT CONVERT(varbinary(max), 'base64 test') FOR XML PATH(''), TYPE).value('/', 'nvarchar(max)'),

              v2 = (SELECT CONVERT(varbinary(max), N'base64 解码测试') FOR XML PATH(''), TYPE).value('/', 'nvarchar(max)')

       )DATA

    )A

 

---------------------------------------------------------

-- 环境要求

 

适用于sql server 2005 或者更高的版本

 

-- ==== 邹建.02(引用请保留此信息) =============== */

CREATE FUNCTION dbo.f_base64_decode(

    @input varchar(max)

)RETURNS varbinary(max)

AS

BEGIN

    DECLARE

       @base64 char(64),

       @pos int,

       @len int,

       @output varbinary(max);

 

    SELECT

       @base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',

       @pos = 1,

       @len = LEN(@input),

       @output = 0x;

 

    IF @input = ''

       RETURN 0x;

 

    IF @len % 4 > 0 OR @len IS NULL

       RETURN NULL;

      

    WHILE @pos < @len

    BEGIN

       SELECT

           @output = @output

              + CONVERT(binary(1), ((v1 & 63) * 4 ) | ((v2 & 48) / 16))

              + CONVERT(binary(1), ((v2 & 15) * 16) | ((v3 & 60) / 4 ))

              + CONVERT(binary(1), ((v3 & 3 ) * 64) | ((v4 & 63) / 1 )),

           @pos = @pos + 4

       FROM(

           SELECT

              v1 = CHARINDEX(SUBSTRING(@input, @pos + 0, 1) COLLATE Chinese_PRC_BIN, @base64) - 1,

              v2 = CHARINDEX(SUBSTRING(@input, @pos + 1, 1) COLLATE Chinese_PRC_BIN, @base64) - 1,

              v3 = CHARINDEX(SUBSTRING(@input, @pos + 2, 1) COLLATE Chinese_PRC_BIN, @base64) - 1,

              v4 = CHARINDEX(SUBSTRING(@input, @pos + 3, 1) COLLATE Chinese_PRC_BIN, @base64) - 1     

       )A;

    END;

 

    RETURN(SUBSTRING(@output, 1, @len / 4 * 3 - 3 + CHARINDEX('=', RIGHT(@input, 2) + '=')));

END;

GO

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

使用NDK实现的Base64编/解码

Base64的编解码原理很简单,下面是编解码的部分核心代码: 编码: /** * 编码 * data : byte数组 * realLength : 数组长度 * offset...
  • vite_s
  • vite_s
  • 2016年11月12日 16:28
  • 745

c语言实现base64编码解码

  • 2015年04月20日 18:26
  • 4KB
  • 下载

011_Base64 编解码C语言实现

  • 2016年10月16日 23:56
  • 165KB
  • 下载

Java 8实现BASE64编解码

Java 8实现BASE64编解码作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszsJava一直缺少BASE64编码 API,以至于通常在项目开发中会选用第三...
  • chszs
  • chszs
  • 2013年11月29日 17:27
  • 34947

base64编解码的C语言实现

  • 2008年10月06日 23:24
  • 3KB
  • 下载

base64 编解码实现(vc code)

  • 2010年09月05日 19:30
  • 8KB
  • 下载

C++实现BASE64码编解码

原文:http://blog.csdn.net/chenxiaohua/archive/2009/04/16/4084602.aspx     #ifndef ___BASE64_H___ #defi...

BASE64编码和解码的JAVA实现

  • 2011年09月20日 23:34
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用 T-SQL 实现 base64 解码
举报原因:
原因补充:

(最多只允许输入30个字)