0

この質問で 2 歩後退したような気がしますが、何かが少し混乱しています。TCP/IP と byte[] を介した通信を行っています。

そこで、byte[] 配列の作成を開始します。3 番目のバイトには、byte[] の長さが必要です。私のバイトをそのように宣言すると;

byte[] bytesToSend = new byte[119];

最初の 3 バイトにデータを入力します。

bytesToSend[0] = 0x40;
bytesToSend[1] = 0x40;
bytesToSend[2] = Encoding.ASCII.GetBytes(bytesToSend.Length.ToString())[0];

最後に、長さを含む 3 番目のバイトを出力します。

MessageBox.Show(BitConverter.ToString(bytesToSend));

119 のバイト サイズを返すことを期待する必要がありますか、それともこれは最大サイズですか? 現在、16進数の「0x31」を返していますが、これは私が知る限り、119または3と等しくありません。これは間違いなく単純で基本的なものですが、誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

6

ここで実際に何をしているのかはっきりしていないようです:

bytesToSend[2] = Encoding.ASCII.GetBytes(bytesToSend.Length.ToString())[0];

この行を分解してみましょう:

bytesToSend.Length 

整数 119 を返します

.ToString()

文字列「119」を返します

Encoding.ASCII.GetBytes("119")

ASCII 文字列 "119" を構成する文字のバイト配列を返します。

[0]

この配列の最初のバイトだけを取得します。これは 0x31 に相当します。これは文字 '1' の ASCII コードであるためです。

また、 ac#の実寸というものはありませんArray。しかありませんLength。ゼロ以外のバイトを含む要素の数を尋ねるつもりなら、それは別の話ですが、一度宣言すると

byte[] bytesToSend = new byte[119];

119 個の要素を持つバイト配列を取得し、Length変更した要素の数に関係なく、常に 119 になります。

より動的なサイズのコレクションを使用する必要がある場合は、List<byte>代わりに a を使用することを検討してください。

于 2013-01-16T12:27:37.457 に答える
5

bytesToSend.Lengthは 119 になります。ただし、に格納119するのではなく、bytesToSend[2]

  • 文字列に変換すると、"119"
  • その文字列をバイト配列の ASCII 表現に変換すると、[49, 49, 57]
  • その結果の最初のバイトを取る、49または0x31.

あなたはただする必要があります

bytesToSend[2] = (byte)bytesToSend.Length;

255 バイト以上を送信すると壊れますが、

于 2013-01-16T12:28:09.980 に答える
1
bytesToSend.Length == 119
bytesToSend.Length.ToString() == "119"
Encoding.ASCII.GetBytes(bytesToSend.Length.ToString()) == {0x31,0x31,0x39}
Encoding.ASCII.GetBytes(bytesToSend.Length.ToString())[0] == 0x31
于 2013-01-16T12:27:32.887 に答える
0

これ:

Encoding.ASCII.GetBytes(bytesToSend.Length.ToString())[0];

最初に値「119」(配列の長さの文字列値)をバイト配列{0x31、0x31、0x39}、1、1、9のASCII値に変換します。次に、それらの最初のものを取得してに割り当てますbytesToSend[2]。そして、それがあなたが得る方法です0x31

あなたの質問に答えるために、配列の長さはあなたが与えた長さ、つまりこの場合は 119 です。

于 2013-01-16T12:30:17.217 に答える