示例#1
0
            public bool Read(BinaryReader br)
            {
                u8 prefix = br.ReadByte();

                if (prefix != PREFIX_SIZE)
                {
                    return(false);
                }

                EncodedInt encSize = new EncodedInt();

                encSize.Read(br);

                u32 size_expected = encSize.Value;
                u32 size_read     = 0;

                bool reading_items = false;

                prefix = br.ReadByte();
                size_read++;

                switch (prefix)
                {
                case PREFIX_ITEM_ID:
                    reading_items = true;
                    break;

                case PREFIX_CLIENT_KEY:
                    break;

                default:
                    return(false);
                }

                if (reading_items)
                {
                    EncodedInt encId = new EncodedInt();
                    encId.Read(br);
                    item_id    = encId.Value;
                    size_read += encId.Length();

                    if (size_read == size_expected)
                    {
                        return(true);
                    }

                    prefix = br.ReadByte();
                    size_read++;

                    if (prefix != PREFIX_ITEM_NAME)
                    {
                        return(false);
                    }
                }

                EncodedInt encName = new EncodedInt();

                encName.Read(br);

                name       = DecodeString(br, encName.Value);
                size_read += encName.Value + encName.Length();

                if (size_read == size_expected)
                {
                    return(true);
                }

                prefix = br.ReadByte();
                size_read++;

                if (reading_items)
                {
                    if (prefix != PREFIX_ITEM_VALUE)
                    {
                        return(false);
                    }
                }
                else if (prefix != PREFIX_CLIENT_VAL)
                {
                    return(false);
                }

                EncodedInt encValue = new EncodedInt();

                encValue.Read(br);
                value = DecodeString(br, encValue.Value);

                size_read += encValue.Value + encValue.Length();;

                if (size_read != size_expected)
                {
                    return(false);
                }

                return(true);
            }
示例#2
0
            public bool Write(BinaryWriter bw)
            {
                byte[] name_encoded  = EncodeString(name);
                byte[] value_encoded = EncodeString(value);

                EncodedInt encName  = new EncodedInt((u32)name_encoded.Length);
                EncodedInt encValue = new EncodedInt((u32)value_encoded.Length);

                u32 total_size = 0;

                EncodedInt encItem = null;

                if (item_id != 0)
                {
                    encItem     = new EncodedInt(item_id);
                    total_size += 1 + encItem.Length();
                }

                if (encName.Value > 0)
                {
                    total_size += 1 + encName.Length() + encName.Value;
                }

                if (encValue.Value > 0)
                {
                    total_size += 1 + encValue.Length() + encValue.Value;
                }

                // write total size
                EncodedInt encTotal = new EncodedInt(total_size);

                bw.Write(PREFIX_SIZE);
                encTotal.Write(bw);

                if (encItem != null)
                {
                    // write item_id
                    bw.Write(PREFIX_ITEM_ID);
                    encItem.Write(bw);

                    // write name
                    if (encName.Value > 0)
                    {
                        bw.Write(PREFIX_ITEM_NAME);
                        encName.Write(bw);
                        bw.Write(name_encoded, 0, name_encoded.Length);
                    }

                    // write value
                    if (encValue.Value > 0)
                    {
                        bw.Write(PREFIX_ITEM_VALUE);
                        encValue.Write(bw);
                        bw.Write(value_encoded, 0, value_encoded.Length);
                    }
                }
                else
                {
                    // write name
                    if (encName.Value > 0)
                    {
                        bw.Write(PREFIX_CLIENT_KEY);
                        encName.Write(bw);
                        bw.Write(name_encoded, 0, name_encoded.Length);
                    }

                    // write value
                    if (encValue.Value > 0)
                    {
                        bw.Write(PREFIX_CLIENT_VAL);
                        encValue.Write(bw);
                        bw.Write(value_encoded, 0, value_encoded.Length);
                    }
                }

                return(true);
            }