小编典典

SQL Server VARBINARY(max)至c#字节[]

sql

我正在查询VARBINARY(MAX)返回一些记录的表(列之一是)。

然后,将其另存为.dat.csv,然后解析该.dat文件,并根据逗号将文件拆分为字符串,从而将该varbinary值转换为字符串。现在,我需要将此varbinary转换为字节数组。我怎样才能做到这一点?


阅读 200

收藏
2021-05-30

共1个答案

小编典典

好问题。从技术上讲,您可以先转换为字符数组,然后转换为字节,以实现此目的。但是,.NET中的字符串默认情况下是Unicode编码的(而不是ASCII),因此变得棘手。

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

这种从字节到字符串到字节的babelfishing的问题在于,某些字节码在每种Unicode编码中都有特殊的含义,从而向解码器提供有关解码下一个字符应拉出的字节数的信息。在各种Unicode编码和.NET本机UTF-8字符串编码之间进行转换时,将获取,丢失和更改字节。如果是弦乐,那就没什么大不了了。编码信息保留在字符串中。当它是二进制数据时,除非以非常特定的方式完成,否则编码和解码会使其乱码。

唯一可以正常使用的方法是,如果您使用ASCII编码写出文件,然后以这种方式读回,这将导致每个单独的字节被视为一个字符。然后,您可以简单地将每个char转换回一个字节,并且Syetem.Char幕后的UInt16的更高有效字节将被丢弃,对于填充到该char的字节而言,这只是零填充。

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];
}
2021-05-30