创建一个名为“ConvertBitStringToBigInt”的用户自定义函数,用于将1到64位的字符串转换为整数(bigint)值。该函数遵循以下逻辑:
- 将输入字符串填充至64位。
- 将每个4位值替换为相应的十六进制数字。
- 使用内置转换函数将得到的十六进制字符串转换为BIGINT。
函数代码如下:
-- 创建一个函数,将1-64位的二进制字符串转换为bigint值。
-- 参考来源:https://stackoverflow.com/questions/77759453/
-- 参考来源:https://stackoverflow.com/questions/58952833/
CREATE FUNCTION ConvertBitStringToBigInt(@BitString VARCHAR(65))
RETURNS BIGINT
AS
BEGIN
-- 验证输入:非空、非空白、长度小于等于64且仅包含二进制字符。
-- (输入参数稍大以检测过大的输入。)
IF (
@BitString IS NULL
OR @BitString = ''
OR LEN(@BitString) > 64
OR @BitString LIKE '%[^01]%'
)
RETURN NULL
-- 在左侧填充输入至64个字符
DECLARE @PaddedString VARCHAR(100)
= REPLICATE('0', 64 - LEN(@BitString)) + @BitString
-- 在每个4位组之间插入分隔符
DECLARE @DelimitedString VARCHAR(100)
= CONCAT(
SUBSTRING(@PaddedString, 1, 4), '_', SUBSTRING(@PaddedString, 5, 4), '_',
SUBSTRING(@PaddedString, 9, 4), '_', SUBSTRING(@PaddedString, 13, 4), '_',
SUBSTRING(@PaddedString, 17, 4), '_', SUBSTRING(@PaddedString, 21, 4), '_',
SUBSTRING(@PaddedString, 25, 4), '_', SUBSTRING(@PaddedString, 29, 4), '_',
SUBSTRING(@PaddedString, 33, 4), '_', SUBSTRING(@PaddedString, 37, 4), '_',
SUBSTRING(@PaddedString, 41, 4), '_', SUBSTRING(@PaddedString, 45, 4), '_',
SUBSTRING(@PaddedString, 49, 4), '_', SUBSTRING(@PaddedString, 53, 4), '_',
SUBSTRING(@PaddedString, 57, 4), '_', SUBSTRING(@PaddedString, 61, 4)
)
-- 将每个4位组转换为十六进制数字并移除分隔符
DECLARE @HexSTring VARCHAR(100) =
REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(
@DelimitedString
, '0000', '0'), '0001', '1'), '0010', '2'), '0011', '3')
, '0100', '4'), '0101', '5'), '0110', '6'), '0111', '7')
, '1000', '8'), '1001', '9'), '1010', 'a'), '1011', 'b')
, '1100', 'c'), '1101', 'd'), '1110', 'e'), '1111', 'f')
, '_', '')
-- 将十六进制转换为BINARY(原始字节串)类型,然后转换为BIGINT
RETURN CONVERT(BIGINT, CONVERT(VARBINARY(8), @HexSTring, 2))
END
示例结果:
以下是您提供的表格内容以Markdown格式呈现:
| BitString | BigIntResult | Binary8 |
| --------------------------------------- | -------------- | --------------------------------- |
| 0010 | 2 | 0x0000000000000002 |
| 0000000000000000000000000000000000000000000000000010 | 2 | 0x0000000000000002 |
| 0100000000000000000000000000000000000000000000001001 | 1125899906842633 | 0x0004000000000009 |
| 0 | 0 | 0x0000000000000000 |
| 1 | 1 | 0x0000000000000001 |
| 11111111 | 255 | 0x00000000000000FF |
| 1111111111111111 | 65535 | 0x000000000000FFFF |
| 01111111111111111111111111111111 | 2147483647 | 0x000000007FFFFFFF |
| 11111111111111111111111111111111 | 4294967295 | 0x00000000FFFFFFFF |
| 0111111111111111111111111111111111111111111111111111111111111111 | 9223372036854775807 | 0x7FFFFFFFFFFFFFFF |
| 1111111111111111111111111111111111111111111111111111111111111111 | -1 | 0xFFFFFFFFFFFFFFFF |
| 1000000000000000000000000000000000000000000000000000000000000000 | -9223372036854775808 | 0x8000000000000000 |
| 1111111011011100101110101001100001110110010101000011001000010000 | -81985529216486896 | 0xFEDCBA9876543210 |
| 11111111111111111111111111111111111111111111111111111111111111111 | null | null |
| 012 | null | null |
| | null | null |
| 00000110010110110001110101101110100 | 853076852 | 0x0000000032D8EB74 |
| 11000111010110111010 | 816570 | 0x00000000000C75BA |
| 00000000000011000111010110111010 | 816570 | 0x00000000000C75BA |
| 11111111111100111000101001000110 | 4294150726 | 0x00000000FFF38A46 |
| 111111111111111111111111111111111111111111111100111000101001000110 | -816570 | 0xFFFFFFFFFFF38A46 |
在此db<>fiddle示例中可查看该函数的实际效果和更多示例结果。