0

我觉得我在这个问题上退了两步,但有些事情让我有点困惑。我正在通过 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

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。

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

于 2013-01-16T12:27:37.457 回答
5

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

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

你只需要做

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 值。然后您将其中的第一个值分配给字节发送[2]。这就是你获得的方式0x31

所以要回答你的问题,数组的长度就是你给它的长度,在这种情况下是 119。

于 2013-01-16T12:30:17.217 回答