【问题标题】:Hexadecimal valued string to varbinary SQL Server 2008 [duplicate]十六进制值字符串到 varbinary SQL Server 2008 [重复]
【发布时间】:2013-07-16 13:46:47
【问题描述】:

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

如何将其恢复为原始格式。我目前正在使用这样的 SQL CAST:

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

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

【问题讨论】:

    标签: c# sql sql-server-2008 varbinary asciiencoding


    【解决方案1】:

    这是将字符串转换回 varbinary(max) 的 T-SQL 代码示例

    declare @hexstring varchar(max)='abcedf012439112200AABBCCFF';
    set @hexstring = '0x'+@hexstring;
    select CONVERT(varbinary(max), @hexstring, 1);
    

    【讨论】:

    • 这可能非常有用!谢谢
    【解决方案2】:

    没有内置函数可以做到这一点。在 C# 中编写一个流式函数来做到这一点很简单(读取 2 个字符,发出一个字节)。您可以使用 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[]
    • 查看byte b = Convert.ToByte(sblock, 16); 行,它将两个字符转换为一个字节,然后将它们写入流。然后流包含一个字节数组。
    【解决方案3】:

    如果我理解正确,您想将每 2 个字符转换为一个字节,这可以使用已回答的问题来实现。

    Convert hex string to byte array 还有How to Convert Hex String to Byte[]

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2017-12-02
      相关资源
      最近更新 更多