SQL Server VARBINARY(max)至c#字节[]
技术问答
212 人阅读
|
0 人回复
|
2023-09-12
|
我正在查询VARBINARY(MAX)返回一些记录表(列之一)。
. l8 @* L7 r7 f5 }然后,另存为.dat.csv,然后解析该.dat文件根据逗号分为字符串,从而将文件分为字符串varbinary将值转换为字符串。现在,我需要这样做varbinary转换成字节数组。我怎样才能做到这一点?5 V1 ]% I( v# K# q& ]
4 T1 D) [; K- U! x$ q) e
解决方案:
( k2 d; W( `$ T" S0 L( v 好问题。从技术上讲,你可以先把它转换成字符数组,然后把它转换成字节,以达到这个目的。.NET默认情况下,中间的字符串是Unicode(而不是ASCII),因此变得棘手。
" ^- e( H* m+ j( S3 I如果可能的话,你应该使用阅读FileStream而不是StreamReader来将varbinary从文件中拉出字节数组,而不是执行与文件编码类型之间的编码转换StreamReader。
5 f! V) g6 |5 V从字节到字符串到字节babelfishing问题是每个字节码都有一些字节码Unicode编码具有特殊的含义,从而为解码器提供解码下一个字符应拉出的字节数的信息。在各种方面Unicode编码和.NET本机UTF-当8字符串编码之间转换时,将获得、丢失和更改字节。如果是弦乐,那就没什么大不了的了。编码信息保留在字符串中。当它是一个二进制数据时,编码和解码会使其混淆,除非它以非常特定的方式完成。2 T7 @' m) k e! {6 J3 _
正常使用的唯一方法是,如果你使用它ASCII编码文件,然后以这种方式读回,这将导致每个单独的字节被视为一个字符。然后,你可以简单地把每个字节都读回来char转换回一个字节,Syetem.Char幕后的UInt16更高有效的字节将被丢弃,填充到这里char的字节而言,这只是零填充。
: O7 L) U7 } }/ z0 P0 jvar reader = new StreamReader(new FileStream("test.csv"),Encoding.ASCII);var varBinaryString = reader.Read();var byteArray = varBinaryString.ToCharArray().Select(c=>(byte)c).ToArray();你也可以在技术上使用任何东西Unicode编码插入,但你需要知道很多关于如何写这些字节以及读者如何读回它们的详细信息,以便执行正确的编码和扩展。! Y" \7 Y6 _3 b% \$ Q/ |0 F
(或放气)获得原始字节流。+ r+ s) H: O0 {8 S+ T. f6 |
编辑: .NET 2.0版本-没有Linq:
# y; ]+ y" t. e3 jStreamReader reader = new StreamReader(new FileStream("test.csv"),Encoding.ASCII);string varBinaryString = reader.Read();char[] charArray = varBinaryString.ToCharArray();byte[] byteArray = new byte[charArray.Length];for(int i=0; i< charArray.Length; i ){ byteArray<i> = (byte)charArray<i>;} |
|
|
|
|
|