<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      XuGang

      記錄一個程序員的成長

       

      SQL Server 中,實現 varbinary 與 varchar 類型之間的數據轉換

       

      在工控應用上,返回的數據經常會以二進制的形成存儲,而這些二進制數據又是以每4個bit表示一個十六進制的數據內容。

      解析的時候,往往是一個字節(Byte)占用8個位(bit),高位4bit 表示一個十六進制數據,低位4bit 表示一個十六進制數據。

       

      問題描述:在SQL Server 數據庫中,如何實現二進制數據與字符串數據之間的直接轉換?

      一定會有人立馬反問我:為什么不在程序中使用 C# 或者 JAVA 或者 C++ 來處理這個業務呢?

      我的回答是:這個我知道,也已經實現了。但在一些特殊的應用環境和業務需求面前(如:對數據的統計、對數據的分析),我必須這么做!

       

      SQL Server 數據庫中,實現 varbinary 類型轉換成 varchar 類型

      這個已經有人實現了,并且處理得相當巧妙。實現的思路是:

      每次取得 varbinary 中一個字節的數據,然后除以16 獲得高位的4bit數據,再模16獲得低位的4bit數據;

      分別從固定字符串中以下標的形式匹配對應的字符,最后累加起來即可。

      代碼如下:

          --==============================================
          --  FUNCTION  varbin2hexstr
          --  將 varbinary 類型的數據轉換為 varchar 類型
          --==============================================
          
          IF OBJECT_ID ('dbo.varbin2hexstr') IS NOT NULL
              DROP FUNCTION dbo.varbin2hexstr
          GO
          
          CREATE function varbin2hexstr(
          @bin varbinary(8000)
          )returns varchar(8000)
          as
          begin
              declare @re varchar(8000),@i int
              select @re='',@i=datalength(@bin)
              while @i>0
                  select @re=substring('0123456789ABCDEF',substring(@bin,@i,1)/16+1,1)
                          +substring('0123456789ABCDEF',substring(@bin,@i,1)%16+1,1)
                          +@re
                      ,@i=@i-1
             -- return('0x'+@re)
              return @re
          end
          
          GO

      測試示例:

      select dbo.varbin2hexstr(0x1432fabcdef1234567890)

      來源:SqlServer中varbinary轉換成字符串

       

      SQL Server 數據庫中,實現 varchar 類型轉換成 varbinary 類型

      一定會有人立馬就說:既然已經實現了varbinary 類型轉換成 varchar 類型,你需要做的,只是將函數逆向反轉實現便可。

      如果真是這么簡單,估計網上早就應該有了。但結果是:網上找不到(至少我沒有找到),實現也并非如此!

      只能自己動手,豐衣足食了。實現的思路是:

      先將整個字符串按照每兩位分組;

           為什么不按照每8位或每4位進行分組?是為了考慮到函數的通用性。

           如果按照每 8位 或者 每4位 分組,則整個字符串必須是8或者4的倍數,否則將出現字符不足,前面補 0的情況。

      然后對每個字符進行處理,如:字符“A B C D E F” 對應轉換為“10 11 12 13 14 15”;

      接著對每2個字符進行 16 的冪運算,并求和。如: AB = 10 * 16的一次方 + 11 * 16的零次方;

      再將這個2個字符的整數和,轉換為一個字節(Byte)長度的 varbinary 數據;

      最后將所有的 varbinary 數據直接相加即可。

      代碼如下:

      --==============================================
      --  FUNCTION  hexstr2varbin
      --  將 varchar 類型的數據轉換為 varbinary 類型
      --==============================================
      
      IF OBJECT_ID ('dbo.hexstr2varbin') IS NOT NULL
          DROP FUNCTION dbo.hexstr2varbin
      GO
      
      CREATE function [dbo].[hexstr2varbin](
        @char varchar(8000)
      )returns varbinary(8000)
      as
      begin
          declare @re varbinary(8000), @tempchar varchar(2), 
                  @getchar varchar(1), @getint int, @n int, @totalint int,
                  @i int, @tempint int, @runNum int -- 字符串截取段數
      
           select @tempchar='',@i=datalength(@char), @re=0x; 
      
          if( @i>0)
          begin
              if ( @i%2 = 0) set @runNum= @i/2
              else set @runNum= @i/2 + 1 
      
              while (@runNum > 0)
              begin
                  if(@runNum = 1) set @tempchar = @char 
                  else set @tempchar = substring(@char, (@runNum-1)*2,2)
      
                  select @n=1,@totalint=0;
                  
                  -- 循環處理截取的每個字符串 (這里的字符串長度為2)
                  while @n < ( datalength(@tempchar) + 1 )
                  begin
                      set @getchar=substring(@tempchar,@n,1);
      
                      -- 將字符轉換為十六進制對應的數字
                      select @getint=case  
                             when @getchar='a' then 10 
                             when @getchar='b' then 11
                             when @getchar='c' then 12 
                             when @getchar='d' then 13
                             when @getchar='e' then 14 
                             when @getchar='f' then 15
                             else  convert(int,@getchar) end;
      
                      set @tempint=@getint*power(16,datalength(@tempchar)-@n)
                      set @totalint = @totalint + @tempint
                      set @n=@n+1
                  end 
      
                     set @re=convert(varbinary(1),@totalint) + @re;    
                     set @runNum=@runNum-1;         
              end
          end
         return @re
      
      end
      GO

      測試示例:

      select dbo.hexstr2varbin('ffffff2353f5feefaffae1fff1ffbaf1faffa33333333ff3aaafffffffaaff')

      (完)

       

      posted on 2012-10-22 11:10  鋼鋼  閱讀(33177)  評論(23)    收藏  舉報

      導航

      主站蜘蛛池模板: 在线一区二区中文字幕| 四虎精品视频永久免费| 亚洲精品美女久久久久9999| 97午夜理论电影影院| 日本欧洲亚洲高清在线| 夜色福利站WWW国产在线视频| 在线精品国产中文字幕| 国产最大的福利精品自拍| 天天躁夜夜躁av天天爽| 国产精品白浆在线观看免费| 国产极品嫩模在线观看91| 亚洲av日韩av一区久久| 日韩av综合免费在线| 福海县| 久久久久人妻精品一区三寸| 天堂网国产| 国产精一品亚洲二区在线播放| 国产成人8X人网站视频| 国产精品亚洲二区在线看| 大香蕉av一区二区三区| 彭水| 天堂久久天堂av色综合| 日本少妇被黑人xxxxx| 免费观看国产女人高潮视频| 亚洲国产精品一区二区久| 大尺度国产一区二区视频| 色悠悠国产精品免费在线| 亚洲高清最新AV网站| 亚洲中文字幕无码爆乳| 成人午夜在线观看日韩| 动漫AV纯肉无码AV电影网| 亚洲综合一区二区三区| 搡老熟女老女人一区二区| 久久视频这里只精品| 强开小雪的嫩苞又嫩又紧| 在线观看免费人成视频色| 美日韩在线视频一区二区三区 | 久久国产成人亚洲精品影院老金| 午夜福利精品国产二区| 国产中文字幕精品视频| 国产高清一区二区不卡|