根据NetworkStream响应定制字节数组大小,包括协议长度



我从TCP服务器收到一个自定义二进制协议响应,格式如下:

响应结构

名称 长度描述
标头2个字节标头是一个固定值十六进制0x0978。
状态1个字节值0表示成功。0以外的值表示错误。下面将对每个可能的错误进行全面描述
长度4字节请求总长度的无符号整数,包括请求中的所有字节(服务器返回little-endian UInt32)

数据变量,0到1048576字节从客户端发送到服务器的数据,根据请求的操作进行编码或解码
校验和1字节从标头到数据的请求中字节的校验和(即不包括校验和字节)。

我遇到的问题是数据的大小可变,所以我不知道从流中读取响应的字节数组的大小。我怎样才能做到这一点?

编辑:我希望前7个字节也包含在最后一个字节数组中的数据中。

一种可能的解决方案:

class Program
{
private static byte[] data = new byte[8]
{
// header
0,
0,
// status
1,
// message size
8,
0,
0,
0,
// data
1
};
static byte[] Read(Stream stream)
{
const int headerLength = 7;
const int sizePosition = 3;
var buffer =  new byte[headerLength];
stream.Read(buffer, 0, headerLength);
// for BitConverter to work
// the order of bytes in the array must 
// reflect the endianness of the computer system's architecture
var size = BitConverter.ToUInt32(buffer, sizePosition);
var result = new byte[size];
Array.Copy(buffer, result, headerLength);
stream.Read(result, headerLength, (int)size - headerLength);
return result;
}
static void Main(string[] args)
{
var stream = new MemoryStream(data);
byte[] bytes = Read(stream);
foreach (var b in bytes)
{
Console.WriteLine(b);
}
}
}

最新更新