SQL Server中完成二進制與字符類型之間的數據轉換。本站提示廣大學習愛好者:(SQL Server中完成二進制與字符類型之間的數據轉換)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server中完成二進制與字符類型之間的數據轉換正文
在工控運用上,前往的數據常常會以二進制的構成存儲,而這些二進制數據又是以每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)
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')
(完)
本文出自 “xugang” 博客,請務必保存此出處http://guangrou.blog.51cto.com/404164/1040606