注册 登录
编程论坛 SQL Server论坛

转摘 SQL2000 Base64编码解码方法

mywisdom88 发布于 2018-03-28 10:33, 2276 次点击
-- SQL2000 Base64编码解码
create function dbo.base64_decode(@encoded_text varchar(8000))
  returns varchar(6000)
  as
  begin
    declare
      @output varchar(8000),  
      @block_start int,  
      @encoded_length int,  
      @decoded_length int,  
      @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
    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(CAST(
          substring(@mapr,ascii(substring(@encoded_text,@block_start,1)),1) * 262144
        + substring(@mapr,ascii(substring(@encoded_text,@block_start + 1,1)),1) * 4096
        + substring(@mapr,ascii(substring(@encoded_text,@block_start + 2,1)),1) * 64
        + substring(@mapr,ascii(substring(@encoded_text,@block_start + 3,1)),1)
        as integer) as binary(3)) as varchar(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 left(@output,@decoded_length)
  end
0 回复
1