加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver 中文base64编解码

发布时间:2020-12-12 13:37:11 所属栏目:MsSql教程 来源:网络整理
导读:1.前言。 ?? 如题,编解码格式都为gbk。编码可以不用函数。直接用for xml 。如: SELECT (SELECT CONVERT(varbinary(max),'分为服务') FOR XML PATH(''),TYPE).value('/','nvarchar(max)') 2.解码。 CREATE FUNCTION dbo.base64_decode(@encoded_text varcha
1.前言。
?? 如题,编解码格式都为gbk。编码可以不用函数。直接用for xml 。如:
SELECT (SELECT CONVERT(varbinary(max),'分为服务') FOR XML PATH(''),TYPE).value('/','nvarchar(max)')
2.解码。

CREATE FUNCTION dbo.base64_decode
(
@encoded_text varchar(max)
)
RETURNS varbinary(max)
AS
BEGIN
DECLARE
    @output varbinary(max),@block_start int,@encoded_length int,@decoded_length int,@mapr binary(122)
IF LEN(@encoded_text) & 3 > 0
    OR @encoded_text LIKE '%[^ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=]%' COLLATE Latin1_General_Bin
    RETURN NULL
SET @output = 0x
-- The nth byte of @mapr contains the base64 value of the character with an ASCII value of n.
-- eg. 65th byte = 0x00 = 0 = value of 'A'
SET @mapr =
          0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -- 1-33
        + 0xFFFFFFFFFFFFFFFFFFFF3EFFFFFF3F3435363738393A3B3C3DFFFFFF00FFFFFF -- 33-64
        + 0x000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF -- 65-96
        + 0x1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233 -- 97-122
--get the number of blocks to be decoded
SET @encoded_length = LEN(@encoded_text)
SET @decoded_length = @encoded_length / 4 * 3
--for each block
SET @block_start = 1
WHILE @block_start < @encoded_length
BEGIN
    --decode the block and add to output
    --BINARY values between 1 and 4 bytes can be implicitly cast to INT
    SET @output = @output +
        CAST(CAST(
              SUBSTRING(@mapr,ASCII(SUBSTRING(@encoded_text,@block_start,1)),1) * 262144
            + SUBSTRING(@mapr,@block_start + 1,1) * 4096
            + SUBSTRING(@mapr,@block_start + 2,1) * 64
            + SUBSTRING(@mapr,@block_start + 3,1)
        AS int) AS binary(3))
    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 SUBSTRING(@output,1,@decoded_length)
END



测试:select convert(varchar(2000),dbo.base64_decode('t9bOqrf+zvE=')? ) 测试结果为:分为服务 3.注意事项。 ? (1)编解码用utf-8毫无意义,以上都是针对gbk,utf-8的可以在网上找下,utf-8的和gbk的编解码方式不同。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读