2012-03-14 3 views
4

私は一般に、人間が判読可能な形式でシリアル化されたデータメッセージを含む言語を持っていますが、言語内の一部のプロダクションにはそのままのバイナリデータが含まれています。バイナリの内容をマングリングせずにByte()から文字列を取得するにはどうすればよいですか?

私のパーサーは、そのバッファにStringを使用しています。これは、作業するのが最も簡単な方法です。しかし、データはネットワークソケットからByteの配列に読み込まれます。

今、私はByte()String間のドットを接続しようとしている:ASCIIエンコーディングは、言葉だけで私のバイトを残して無効であることが判明しただろうと

' data as Byte() 
' count as Integer 
' buffer as String 

buffer += System.Text.Encoding.ASCII.GetString(data, 0, count) 

しかし、私の最初の仮定。 7ビットモデルに収まらない値を持つバイトは'?'に変換されました。

' data as Byte() 
' count as Integer 
' buffer as String 

Dim enc = New System.Text.UTF8Encoding 
buffer += enc.GetString(data, 0, count) 

しかし、私のデータはまだマングルされている:

だから、私は一人で私のバイトを残すだけでなく、8ビットの範囲全体の値を許可する必要があり、シングルバイトの「ユニコード」エンコーディングを使用して考えました。私は実際にはを正確にのように推論することはできませんでしたが、データの長さが変化していることを知っています。バイトがそのまま残っていないことを示しています。

Stringの内容は、Bytes()の入力の内容をそのままコピーしたものですか。

+1

どのようにバイトを最初にエンコードしましたか? – JaredPar

+0

@ JaredPar:テキストはエンコードされません。問題のバイトはバイナリです。 (入力データストリームの人間が読めるセクションはASCIIですが)このエンコーディングに不可欠なものを維持しながらByte()から 'String'を取得したいのです。おそらくVB.NETはこれをサポートしていませんか? –

+0

あなたは正しくデコードするためにエンコーディングについて少し知っておく必要があります。エンコーディングをバイトストリーム自体にエンコードしない限り、それは本当に無関心ではありません。人間が読めるようなコンテンツを見過ごしている可能性があります。あなたは 'byte()'のフォーマットを持っていますか? – JaredPar

答えて

2

私たちのコメントの議論に基づいて、Byteのインスタンスをエンコードの非公開にしたいと思うようです。この場合、Stringの代わりにList(Of Byte)を使用することを検討する必要があります。

+0

確かに; NETの 'String'型がエンコーディングを認識していることが問題全体の根本的な原因であることを認識していません。したがって、最良の解決策は、 'String 'が提供する簡単な部分文字列検索操作を失ったにもかかわらず、パーサ全体を通して他の部分を使用することです。これが完了し、うまくいきます。ありがとう! –

関連する問題