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

时间:2013-01-16 12:23:10

标签: c# encoding bytearray

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

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

byte[] bytesToSend = new byte[119];

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

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

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

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

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

4 个答案:

答案 0 :(得分: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代码。

此外,没有c#Array实际大小。只有Length。如果你想询问有多少元素包含非零字节,那就是另一个故事,但是一旦你宣布

byte[] bytesToSend = new byte[119];

你得到一个包含119个元素的字节数组,无论你修改了多少个元素,它的Length始终为119。

如果您需要使用更具动态尺寸的集合,请考虑使用List<byte>代替。

答案 1 :(得分:5)

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

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

你只需要做

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

虽然如果发送超过255个字节,这将会中断,

答案 2 :(得分: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

答案 3 :(得分:0)

此:

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

首先将值“119”(数组长度的字符串值)转换为字节数组{0x31,0x31,0x39},将ascii值转换为1,1,9。然后,您将获取第一个和将其分配给bytesToSend [2]。这就是你获得0x31的方式。

所以为了回答你的问题,数组的长度是你给它的长度,在这种情况下是119.