byte []的byte.length()是最大大小还是实际大小?

Sha*_*e.C 0 c# encoding bytearray

我觉得我在这个问题上退了两步,但有些事情让我感到困惑.我正在通过TCP/IP和byte []进行一些通信.

所以我开始构建我的byte []数组,第三个字节需要byte []的长度.如果我这样声明我的字节;

byte[] bytesToSend = new byte[119];
Run Code Online (Sandbox Code Playgroud)

然后用数据填充前三个字节..

bytesToSend[0] = 0x40;
bytesToSend[1] = 0x40;
bytesToSend[2] = Encoding.ASCII.GetBytes(bytesToSend.Length.ToString())[0];
Run Code Online (Sandbox Code Playgroud)

最后只打印出第三个字节,其中应包含长度;

MessageBox.Show(BitConverter.ToString(bytesToSend));
Run Code Online (Sandbox Code Playgroud)

我应该期望它返回119的字节大小,或者这只是最大大小?目前它正在返回十六进制"0x31",据我所知,它不等于119或3.毫无疑问,我缺少一些简单/基本的东西,但是有人能指出我正确的方向吗?

Rot*_*tem 6

似乎你不清楚你在这里做了什么:

bytesToSend[2] = Encoding.ASCII.GetBytes(bytesToSend.Length.ToString())[0];
Run Code Online (Sandbox Code Playgroud)

让我们打破这一行:

bytesToSend.Length 
Run Code Online (Sandbox Code Playgroud)

返回整数119

.ToString()
Run Code Online (Sandbox Code Playgroud)

返回字符串"119"

Encoding.ASCII.GetBytes("119")
Run Code Online (Sandbox Code Playgroud)

返回组成ascii字符串"119"的字符的字节数组.

[0]
Run Code Online (Sandbox Code Playgroud)

获取此数组的第一个字节,它等于0x31,因为这是字符"1"的ascii代码.

此外,没有ac#的实际大小Array.只有一个Length.如果你想询问有多少元素包含非零字节,那就是另一个故事,但是一旦你声明了

byte[] bytesToSend = new byte[119];
Run Code Online (Sandbox Code Playgroud)

你得到一个包含119个元素的字节数组Length,无论你修改了多少个元素,它都将是119.

如果您需要使用具有更大动态大小的集合,请考虑使用List<byte>替代.


Raw*_*ing 5

bytesToSend.Length将119但是,而不是存储119bytesToSend[2],你

  • 将其转换为字符串, "119"
  • 将该字符串转换为字节数组中的ASCII表示形式, [49, 49, 57]
  • 取结果的第一个字节,490x31.

你只需要这样做

bytesToSend[2] = (byte)bytesToSend.Length;
Run Code Online (Sandbox Code Playgroud)

虽然如果你发送超过255个字节会破坏,