我觉得我在这个问题上退了两步,但有些事让我感到困惑。我正在通过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.毫无疑问,我缺少一些简单/基本的东西,但是有人能指出我正确的方向吗?
答案 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"
[49, 49, 57]
49
或0x31
。你只需要做
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.