2011-02-04 35 views
2

テーブルを照会しています(列の1つがVARBINARY(MAX))。一部のレコードが返されます。SQL Server VARBINARY(max)からc#byte []

次に、.dat.csvとして保存します。次に、その.datファイルを解析し、コンマに基づいてファイルを分割してvarbinary値を文字列に取得します。今私はこのvarbinaryをバイト配列に変換する必要があります。どうやってやるの?

+1

あなたは真のバイト配列にvarbinary型を含む文字列を変換したいですか? –

+1

私は何かが不足している可能性が高いですが、なぜCSVの段階に中間者ですか?文字列があり、byte []が必要な場合は、var encoding = new System.Text.UTF8Encoding()を実行するだけです。 var bytes = encoding.GetBytes(str); – Sean

+0

@Robyconte - Yeah – Pinu

答えて

5

良い質問です。技術的には、最初に文字配列に変換してからバイトに変換することでこれを行うことができます。ただし、.NETの文字列は、ASCIIの代わりにデフォルトでUnicodeエンコードされているため、扱いにくくなります。

可能であれば、ファイルのエンコードタイプとの間でエンコードの変換を実行するStreamReaderではなく、読み込んでいるFileStreamを使用して、ファイルからvarbinaryをバイト配列として取得してください。

このバイト・ツー・ストリング・ツー・バイト・バブルフィッシングの問題は、特定のバイトコードが各Unicodeエンコーディングで特別な意味を持ち、次の文字のデコードに必要なバイト数に関する情報をデコーダに与えることです。さまざまなUnicodeエンコーディングと文字列の.NETネイティブUTF-8エンコーディング間で変換を行うと、バイトが取得され、失われ、変更されます。それが文字列であれば、大したものではありません。エンコーディング情報は文字列のままです。バイナリデータの場合、エンコーディングとデコードは非常に特殊な方法で行われていない限り、それを壊す可能性があります。

これが完璧に機能する唯一の方法は、ASCIIエンコーディングを使用してファイルを書き出し、それをそのまま読み込んで個々のバイトを1文字として扱うことです。その後、各文字をバイトに変換するだけで、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エンコーディングを使用して、それを引くことができますが、あなたはそれらのバイトを書いて、どのように読者がよう、後ろにそれらを読んでいる方法についての詳細の多くを知っている必要があります必要に応じて元のバイトストリームを取得するために正しいエンコードと展開(またはデフレーション)を実行できます。

EDIT: .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]; 
} 
+0

サンプルコードのvarは私を混乱させますか? – Pinu

+0

あなたに何が混乱していますか?最初の行はファイルから読み込み、ASCIIエンコーディングで書かれたものとみなすStreamReaderを設定しています。 2番目のようなものは、StreamReaderを使用して実際にファイルからvarbinaryを取得するためのプレースホルダです。 3つ目は注意が必要なことですが、ASCII準拠の文字コードのみで構成される文字列に対してのみ動作することに注意してください。 – KeithS

+0

私のC#バージョンはvarをサポートしていません – Pinu

関連する問題