Martin 的问题中的评论让我知道了如何拆分二进制文件,以便我可以对这些值进行异或运算。
最初我想在 sql 中对两个 GUID 进行异或。所以这是我附带的代码:
declare @guid1 uniqueidentifier
declare @guid2 uniqueidentifier
declare @guid3_hi binary(8)
declare @guid3_lo binary(8)
declare @guid3_temp varchar(32)
declare @guid3_char varchar(36)
declare @guid3 uniqueidentifier
set @guid1 = '96B4316D-1EA7-4CA3-8D50-FEE8047C1329'
set @guid2 = 'FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF'
set @guid3_hi = CAST(SUBSTRING(CAST(@guid1 as binary(16)),1,8) as bigint) ^ CAST(SUBSTRING(CAST(@guid2 as binary(16)),1,8) as bigint)
set @guid3_lo = CAST(SUBSTRING(CAST(@guid1 as binary(16)),9,8) as bigint) ^ CAST(SUBSTRING(CAST(@guid2 as binary(16)),9,8) as bigint)
set @guid3_temp = SUBSTRING(dbo.sp_hexadecimal(@guid3_hi), 3, 16) + SUBSTRING(dbo.sp_hexadecimal(@guid3_lo), 3, 16)
select @guid3_temp
set @guid3_char = SUBSTRING(@guid3_temp, 1, 8) + '-' + SUBSTRING(@guid3_temp, 9, 4) + '-' + SUBSTRING(@guid3_temp, 13, 4) + '-' + SUBSTRING(@guid3_temp, 17, 4) + '-' + SUBSTRING(@guid3_temp, 21, 12)
select @guid3_char
set @guid3 = convert(uniqueidentifier, @guid3_char)
select @guid3
--result 92CE4B69-58E1-5CB3-72AF-0117FB83ECD6
二进制转十六进制字符串的函数来自:Converting Binary Data to Hexadecimal String
我知道在 SQL 2008 中我们可以使用转换函数来执行此操作,正如这篇文章所解释的:SQL Server 2008 : new binary – hex string conversion,但在我的情况下这不是一个选项。
但是,如果有人对我们如何对二进制数据类型使用 SQL 位运算有更好的了解,那就太好了。
编辑:
感谢cyberkiwi 提供正确的算法并指出我的代码中的错误。
此代码可能适用于 XOR-ing 二进制文件,但不适用于 GUID,因为 GUID 的前 8 个字节和后 8 个字节的字节顺序不同。请查看维基百科对此的解释:GUID Basic structure。请注意,如果您要将异或结果用作真正的 GUID,您应该考虑并考虑版本位。