2011-02-04 133 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]; 
}