コード例 #1
0
        public static SoftEtherParameterCollection Deserialize(byte[] body)
        {
            var memStream = new MemoryStream(body, false);
            var reader    = new BinaryReader(memStream);

            var count = reader.ReadUInt32BE();

            var res = new SoftEtherParameterCollection();

            for (var i = 0; i < count; i++)
            {
                var keyLen     = reader.ReadInt32BE();
                var key        = Encoding.ASCII.GetString(reader.ReadBytesRequired(keyLen - 1));
                var valueType  = (SoftEtherValueType)reader.ReadUInt32BE();
                var valueCount = reader.ReadUInt32BE();

                var list = new List <object>();
                for (var j = 0; j < valueCount; j++)
                {
                    switch (valueType)
                    {
                    case SoftEtherValueType.Int:
                    {
                        list.Add(reader.ReadUInt32BE());
                        break;
                    }

                    case SoftEtherValueType.Raw:
                    {
                        var strLen = reader.ReadInt32BE();
                        list.Add(reader.ReadBytesRequired(strLen));
                        break;
                    }

                    case SoftEtherValueType.String:
                    {
                        var strLen = reader.ReadInt32BE();
                        list.Add(Encoding.ASCII.GetString(reader.ReadBytesRequired(strLen)));
                        break;
                    }

                    case SoftEtherValueType.UnicodeString:
                    {
                        //softether adds a additional 0-byte to every string. For future sake, just trim it instead of reading a byte less
                        var strLen = reader.ReadInt32BE();
                        list.Add(Encoding.UTF8.GetString(reader.ReadBytesRequired(strLen)).TrimEnd('\0'));
                        break;
                    }

                    case SoftEtherValueType.Int64:
                    {
                        list.Add(reader.ReadUInt64BE());
                        break;
                    }

                    default:
                        throw new ArgumentException("ValueType is not valid");
                    }
                }

                res.Add(key, valueType, list);
            }
            return(res);
        }