使用 T-SQL 实现 base64 解码

本文介绍了一个用于SQL Server的Base64解码函数,解决了FOR XML PATH生成的Base64编码数据无法直接解码的问题。适用于SQL Server 2005及以上版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 + 01) COLLATE Chinese_PRC_BIN, @base64- 1,
              v2 
= CHARINDEX(SUBSTRING(@input@pos + 11) COLLATE Chinese_PRC_BIN, @base64- 1,
              v3 
= CHARINDEX(SUBSTRING(@input@pos + 21) COLLATE Chinese_PRC_BIN, @base64- 1,
              v4 
= CHARINDEX(SUBSTRING(@input@pos + 31) COLLATE Chinese_PRC_BIN, @base64- 1     
       )A;
    
END;
 
    
RETURN(SUBSTRING(@output1@len / 4 * 3 - 3 + CHARINDEX('='RIGHT(@input2+ '=')));
END;
GO


转载于:https://www.cnblogs.com/wenanry/archive/2010/02/07/1665450.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值