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

Pin*_*inu 2 c# sql t-sql sql-server

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

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

Kei*_*thS 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();
Run Code Online (Sandbox Code Playgroud)

从技术上讲,您也可以使用任何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];
}
Run Code Online (Sandbox Code Playgroud)