SQL Server VARBINARY(max)到c#byte []

时间:2011-02-04 16:51:02

标签: c# sql sql-server tsql

我正在查询表(其中一列是VARBINARY(MAX)),它会返回一些记录。

然后我将其保存为.dat.csv然后我解析该.dat文件并通过基于逗号分割文件将该varbinary值转换为字符串。现在我需要将此varbinary转换为字节数组。我怎么能这样做?

2 个答案:

答案 0 :(得分:5)

好问题。从技术上讲,您可以通过首先转换为字符数组,然后转换为字节来完成此操作。但是,.NET中的字符串默认是Unicode编码的(而不是ASCII),所以它变得棘手。

如果可能的话,你应该尝试将varbinary作为字节数组从文件中拉出来,使用你正在读取的FileStream而不是StreamReader,它执行与文件编码类型之间的编码转换。

这种字节到字符串到字节的区别问题是某些字节码在每个Unicode编码中都有特殊含义,它向解码器提供有关它应该为解码下一个字符所需的字节数的信息。在各种Unicode编码和字符串的.NET原生UTF-8编码之间进行转换时,将获得,丢失和更改字节。当它是一个字符串,没有大事;编码信息保留在字符串中。当它是二进制数据时,除非以非常特定的方式完成,否则编码和解码可能会乱码。

唯一可以完美运行的方法是使用ASCII编码将文件写出来,然后将其读回,这将导致每个字节被视为单个字符。然后,您可以简单地将每个字符串转换回一个字节,并且Syetem.Char幕后的UInt16的更重要字节将被丢弃,该字节只是用于输入该字符的字节的零填充。

var reader = new StreamReader(new FileStream("test.csv"), Encoding.ASCII);
var varBinaryString = reader.Read(<wherever the varbinary is in the file/line>);

var byteArray = varBinaryString.ToCharArray().Select(c=>(byte)c).ToArray();

从技术上讲,您也可以使用任何Unicode编码将其拉入,但是您需要了解有关如何写出这些字节以及读者如何重新读取它们的许多细节,以便您可以执行正确的操作根据需要进行编码和扩展(或放气)以获得原始字节流。

编辑: .NET 2.0版本 - 没有Linq:

StreamReader reader = new StreamReader(new FileStream("test.csv"), Encoding.ASCII);
string varBinaryString = reader.Read(<wherever the varbinary is in the file/line>);

char[] charArray = varBinaryString.ToCharArray();
byte[] byteArray = new byte[charArray.Length];

for(int i=0; i< charArray.length; i++)
{
    byteArray[i] = (byte)charArray[i];
}

答案 1 :(得分:0)

当您在SQL结果集中只有一个或服务器值并且不想将其转换为* .csv等时,我为这种情况建立了更简单的解决方案。

复制粘贴SQL-varbinary-values的情况是可以接受的。

using System;
using System.Text;

namespace TestProj
{
    class Program
    {
        static void Main(string[] args)
        {
            //the value from database (Ctrl+C & Ctrl+V)
            string varbinaryStr = "0x7B2255";  

            //remove '0x' prefix AND trailing spaces
            var no_0x_varbinary_str = varbinaryStr.Replace("0x", "").Trim();

            //the bytes
            byte[] bytes = StrToByteArray(no_0x_varbinary_str);
            
            //now you can work with the bytes as you need
            //in my case there was an UTF8-string that have been saved in SQL as varbinary
            //so I am just decode it like this
            var string_from_database = Encoding.UTF8.GetString(bytes);
            
            Console.ReadKey();
        }
        
        static byte[] StrToByteArray(string str)
        {
            Dictionary<string, byte> hexindex = new Dictionary<string, byte>();
            for (int i = 0; i <= 255; i++)
                hexindex.Add(i.ToString("X2"), (byte)i);

            List<byte> hexres = new List<byte>();
            for (int i = 0; i < str.Length; i += 2)
                hexres.Add(hexindex[str.Substring(i, 2)]);

            return hexres.ToArray();
        }
    }
}

this question中发现的stringbyte[]StrToByteArray转换的示例中,您可以找到other refference来讨论最快的转换方式(包括示例和测试)。