2011-02-04 128 views
2

我查询表(其中一列是VARBINARY(MAX)),它返回一些记录。SQL Server VARBINARY(最大)到C#字节[]

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

+1

你想转换包含一个字节数组真正VARBINARY字符串? – 2011-02-04 16:58:04

+1

我很可能错过了一些东西,但是为什么中间要到CSV步骤?如果你有一个字符串,你想要byte [],你可以运行var encoding = new System.Text.UTF8Encoding(); var bytes = encoding.GetBytes(str); – Sean 2011-02-04 17:02:55

回答

5

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

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

这个字节到字符串到字节的babelfishing的问题是,某些字节码在每个Unicode编码中都有特殊的含义,给解码器提供信息来解码下一个字符。当在各种Unicode编码和字符串的.NET本地UTF-8编码之间进行转换时,字节会被获取,丢失和更改。当它是一个字符串,没有biggie;编码信息与字符串保持一致。当它是二进制数据时,编码和解码可能会让它乱码,除非它是以非常特定的方式完成的。

这将完美地工作的唯一方法是如果您使用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]; 
}