0

Java 関数があり、VB.NET で同じ機能を模倣しようとしています。

Java 関数:

String text = “ABCDEFG”
int length = text.length();
int l1 = length >> 8;
int l2 = length % 256;
swriter.write(new byte[] {(byte)l1, (byte)l2});

私のVB.NET変換機能:

Dim text As String = "ABCDEFG"
Dim length As Integer = text.Length
Dim l1 As Integer = length >> 8
Dim l2 As Integer = length Mod 256
Dim tempArr(2) As Byte
tempArr(0) = Convert.ToByte(l1)
tempArr(1) = Convert.ToByte(l2)
swriter.Write(tempArr)

swriter は StreamWriter です

つまり、ストリームライターを介してサーバーに書き込まれた値を確認するたびに、" System.byte[]" と表示されるということです。BitConverter.GetBytes() 関数も使用してみましたが、同じ結果が得られます。

私が見逃しているのは何ですか?そして、数字をByte形式で書く方法。上記の例では、テキストの長さは 7("ABCDEFG") ですが、私のアプリケーションでは 1000 以上になります。

4

1 に答える 1

4

StreamWriter.Write() メソッドのドキュメントをご覧ください。これらのオーバーロードを参照すると、どれも byte array を受け入れません。最適な一致は文字列であるため、これは IL にコンパイルされ、配列の .ToString() メソッドを呼び出して配列を文字列に変換しようとします。配列は .ToString() メソッドをオーバーロードしないため、基本オブジェクト型のデフォルトの実装を取得し、型名を返すだけです...したがって、System.byte[]結果が得られます。

StreamWriter がバイト配列をどう処理するかを知らないのはなぜなのか、疑問に思う人もいるでしょう。引用した StreamWriter type に関するドキュメントを確認しましょう。

特定のエンコーディングで文字をストリームに書き込むための TextWriter を実装します。

あはは!バイト配列の過負荷がない理由は、テキストを使用するために特別に設計されたタイプを使用しているためです。

これを修正するには、StreamWriter の代わりに基本Stream型またはBinaryWriter型を使用する必要があります。これらのタイプのいずれも、バイト配列を扱うのに完全に満足しています。

最後に、私がそうしている間に、配列が間違っていると宣言したことを指摘する必要があります。VB.Net では、配列宣言の添え字は、配列内の最後の要素のインデックスです。は、0、1、および 2 のインデックスを持つ 2 つではなく3 つのDim tempArr(2) As Byte要素を持つ配列を宣言します。

于 2013-04-29T20:01:11.470 に答える