十六进制字符串转换为二进制变量在SQL Server 2008中

3
我有一个带有十六进制值的字符串,例如:"AD5829FC...",它是一个varbinary,我将其保存为十六进制文本文件。问题是,我需要通过C#和SQL Server 2008运行插入查询来将其转换回varbinary。

如何将其转换回原始格式?我目前使用类似以下的SQL CAST:

CAST('HEX VALUE' AS varbinary(MAX))

注意:我需要像之前展示的那样将其保存到文本文件中,以便CSV不会从十六进制序列中获取任何\n或逗号字符。

3个回答

4
这里是将字符串转换回varbinary(max)的T-SQL代码示例:
declare @hexstring varchar(max)='abcedf012439112200AABBCCFF';
set @hexstring = '0x'+@hexstring;
select CONVERT(varbinary(max), @hexstring, 1);

这可能非常有用!谢谢。 - rdelfin

1
没有内置的函数可以完成这个任务。用C#编写一个流函数来完成这个任务非常简单(读取2个字符,发出1个字节)。您可以在引擎内使用SQLCLR函数来执行此操作,也可以在客户端上执行此操作。如果输入很大,则最好在客户端上执行以避免内存超载。
以下是一个示例,演示了流式转换(没有进行优化,但强调了将string转换为byte[]的重要性):
namespace hex2bin
{
    class Program
    {
        public static void hex2bin(TextReader sin, BinaryWriter sout)
        {
            char[] block = new char[2];
            bool eof = false;
            do
            {
                int chars = sin.ReadBlock(block, 0, 2);
                switch (chars)
                {
                    case 0:
                        eof = true;
                        break;
                    case 1:
                        // Input is odd length, invalid case
                        throw new Exception("Invalid input");
                    case 2:
                        string sblock = new String(block);
                        byte b = Convert.ToByte(sblock, 16);
                        sout.Write(b);
                        break;
                }
            } while (!eof);

        }

        static void Main(string[] args)
        {
            using (StringReader sr = new StringReader("AD5829FC"))
            {
                using (BinaryWriter bw = new BinaryWriter(new MemoryStream()))
                {
                    hex2bin(sr, bw);
                }
            }
        }
    }
}

好的,它可能会在客户端上,因为它可能会变得相当大,但我该怎么做呢?我如何将string内部的十六进制转换为byte[] - rdelfin
看到这行代码 byte b = Convert.ToByte(sblock, 16);,它将两个字符转换为一个字节,然后写入流中。流现在包含一个字节数组。 - Denise Skidmore

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接