3

たとえば、次のような 16 進数値の文字列があります。"AD5829FC..."これは、16 進数でテキスト ファイルに保存した varbinary です。問題は、C# と SQL Server 2008 で挿入クエリを実行して、これを varbinary に戻す必要があるということです。

元の形式に戻すにはどうすればよいですか。私は現在、SQL CAST を次のように使用しています。

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

注: CSVが16進数のシーケンスから\nまたはコンマ文字を取得しないように、先ほど示したようにテキストファイルに保存する必要があります

4

3 に答える 3

4

文字列を varbinary(max) に戻す T-SQL コードの例を次に示します。

declare @hexstring varchar(max)='abcedf012439112200AABBCCFF';
set @hexstring = '0x'+@hexstring;
select CONVERT(varbinary(max), @hexstring, 1);
于 2013-07-16T14:20:56.030 に答える
1

2文字ごとに1バイトに変換したいことが正しく理解できれば、これは既に回答された質問を使用して達成できます。

16進文字列をバイト配列変換する 16進文字列をバイト[]に変換する方法

それが役に立てば幸い。

于 2013-07-16T13:56:55.510 に答える
1

これを行うための組み込み関数はありません。それを行うために C# でストリーミング関数を作成するのは簡単です (2 文字を読み取り、1 バイトを出力します)。SQLCLR 関数を使用してエンジン内で実行することも、クライアント側で実行することもできます。入力が大きい場合は、メモリの過負荷を避けるためにクライアント側で行う方が間違いなく優れています。

ストリーミング変換の例を次に示します (最適化はありませんが、 aを a に変換しないことの重要性を強調しています)。stringbyte[]

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);
                }
            }
        }
    }
}
于 2013-07-16T13:51:44.380 に答える