Sql server 如何从表示为整数的颜色输出RGB值?

Sql server 如何从表示为整数的颜色输出RGB值?,sql-server,tsql,Sql Server,Tsql,在SQL Server 2012中,如何将int表示的颜色(存储为0xBBGGRR)转换为R=123、G=234、B=12格式的字符串?我们将忽略alpha部分 例如,给定一个整数值0xff223344,您将得到R=68、g=51、B=34这样的解决方案如何 Declare @i int Set @i=0xff223344 select 'R=' + Cast(Cast(SubString(CAST(@i as BINARY(4)),4,1) as int) as Varchar(3))

SQL Server 2012
中,如何将
int
表示的颜色(存储为0xBBGGRR)转换为
R=123、G=234、B=12
格式的字符串?我们将忽略alpha部分


例如,给定一个整数值
0xff223344
,您将得到
R=68、g=51、B=34

这样的解决方案如何

Declare @i int
Set @i=0xff223344
select 
  'R=' + Cast(Cast(SubString(CAST(@i as BINARY(4)),4,1) as int) as Varchar(3))
+ ', G=' + Cast(Cast(SubString(CAST(@i as BINARY(4)),3,1) as int) as Varchar(3))
+ ', B=' + Cast(Cast(SubString(CAST(@i as BINARY(4)),2,1) as int) as Varchar(3))
declare @i int = 0x223344

select 'R=' + cast (@i % 256 as varchar)
    + ', G=' + cast (@i / 256 % 256 as varchar)
    + ', B=' + cast (@i / 65536 % 256 as varchar)
或者,如果alpha通道有
ff

declare @i int = 0xff443322

if @i < 0
    set @i = @i % cast(0x1000000 as int) - cast(0xff000000 as int)

select 'R=' + cast (@i % 256 as varchar)
    + ', G=' + cast (@i / 256 % 256 as varchar)
    + ', B=' + cast (@i / 65536 % 256 as varchar)
declare@i int=0xff443322
如果@i<0
设置@i=@i%cast(0x1000000为int)-cast(0xff000000为int)
选择“R=”+cast(@i%256为varchar)
+“,G=”+cast(@i/256%256作为varchar)
+“,B=”+cast(@i/65536%256作为varchar)

这样的解决方案怎么样

declare @i int = 0x223344

select 'R=' + cast (@i % 256 as varchar)
    + ', G=' + cast (@i / 256 % 256 as varchar)
    + ', B=' + cast (@i / 65536 % 256 as varchar)
或者,如果alpha通道有
ff

declare @i int = 0xff443322

if @i < 0
    set @i = @i % cast(0x1000000 as int) - cast(0xff000000 as int)

select 'R=' + cast (@i % 256 as varchar)
    + ', G=' + cast (@i / 256 % 256 as varchar)
    + ', B=' + cast (@i / 65536 % 256 as varchar)
declare@i int=0xff443322
如果@i<0
设置@i=@i%cast(0x1000000为int)-cast(0xff000000为int)
选择“R=”+cast(@i%256为varchar)
+“,G=”+cast(@i/256%256作为varchar)
+“,B=”+cast(@i/65536%256作为varchar)
使用按位and(&)运算符:

declare @i int
set @i=0xff223344

select 
  'R=' +   cast(@i & 0xFF as varchar(3)) +
  ', G=' + cast((@i & 0xFF00) / 0x100 as varchar(3)) +
  ', B=' + cast((@i & 0xFF0000) / 0x10000 as varchar(3)) 
使用按位and(&)运算符:

declare @i int
set @i=0xff223344

select 
  'R=' +   cast(@i & 0xFF as varchar(3)) +
  ', G=' + cast((@i & 0xFF00) / 0x100 as varchar(3)) +
  ', B=' + cast((@i & 0xFF0000) / 0x10000 as varchar(3)) 

事实上,我同意它看起来像一个复制品。这个问题中的“将答案放在字符串中”条件很简单。然而,由于这个问题的所有答案都比另一个问题的所有答案更加简洁明了。。。最好的选择是什么?我们是否投票关闭这一个,并将答案复制到其他地方?可能的重复事实上,我同意它看起来像是重复的。这个问题中的“将答案放在字符串中”条件很简单。然而,由于这个问题的所有答案都比另一个问题的所有答案更加简洁明了。。。最好的选择是什么?我们投票结束这一个,然后把答案复制过来吗?太棒了!现在,提供的解决方案中哪一个是最有效的?我选择按位AND和除法,因为它们是最干净的代码,而不是速度。这是我在汇编代码时代应该做的事情。然而,在几乎任何编程语言中,纯算术运算都比字符串操作快。太棒了!现在,提供的解决方案中哪一个是最有效的?我选择按位AND和除法,因为它们是最干净的代码,而不是速度。这是我在汇编代码时代应该做的事情。然而,在几乎任何编程语言中,纯算术运算都比字符串操作快。谢谢!那么,所提供的解决方案中哪一个是最有效的呢?@完美主义者的解决方案似乎更快。循环10000000次除法29秒对二进制33段!那么,所提供的解决方案中哪一个是最有效的呢?@完美主义者的解决方案似乎更快。循环10000000次除法29秒与二进制33秒为什么不使用按位AND<代码>设置@i=(@i&0x00ffffff)同意。那会更好。为什么不直接使用按位AND呢<代码>设置@i=(@i&0x00ffffff)同意。那会更好。