// 読み込む public static PackElement CreateFromBuf(Buf b) { // 名前 string name = b.ReadStr(true); // 種類 PackValueType type = (PackValueType)b.ReadInt(); // 項目数 uint num = b.ReadInt(); PackElement e = new PackElement(name, type); // 値 uint i; for (i = 0; i < num; i++) { PackValue v = PackValue.CreateFromBuf(b, i, type) !; e.AddValue(v); } return(e); }
// コンストラクタ public PackElement(string name, PackValueType type) { this.name = name; this.type = type; maxIndex = 0; this.values = new Dictionary <uint, PackValue>(); }
// 書き出す public void WriteToBuf(Buf b, PackValueType type) { switch (type) { case PackValueType.Int: b.WriteInt(IntValue); break; case PackValueType.Int64: b.WriteInt64(Int64Value); break; case PackValueType.Data: b.WriteInt((uint)Data.Length); b.Write(Data); break; case PackValueType.Str: b.WriteStr(StrValue.Trim()); break; case PackValueType.UniStr: byte[] data = Str.Utf8Encoding.GetBytes(StrValue.Trim()); b.WriteInt((uint)data.Length + 1); b.Write(data); b.WriteByte(0); break; } }
// 読み込む public static PackValue?CreateFromBuf(Buf b, uint index, PackValueType type) { switch (type) { case PackValueType.Int: return(new PackValue(index, b.ReadInt())); case PackValueType.Int64: return(new PackValue(index, b.ReadInt64())); case PackValueType.Str: return(new PackValue(index, b.ReadStr().Trim())); case PackValueType.UniStr: uint len = b.ReadInt(); if (len == 0) { return(new PackValue(index, "")); } else { byte[] data = b.Read(len - 1); b.Read(1); return(new PackValue(index, Str.Utf8Encoding.GetString(data).Trim())); } case PackValueType.Data: uint size = b.ReadInt(); return(new PackValue(index, b.Read(size))); } return(null); }
PackElement getElementAndCreateIfNotExists(string name, PackValueType type) { PackElement?e = getElement(name); if (e != null) { return(e); } e = new PackElement(name, type); addElement(e); return(e); }
// デフォルトの値 public static PackValue?GetDefaultValue(uint index, PackValueType type) { switch (type) { case PackValueType.Int: return(new PackValue(index, 0)); case PackValueType.Int64: return(new PackValue(index, 0)); case PackValueType.Str: return(new PackValue(index, "")); case PackValueType.UniStr: return(new PackValue(index, "")); case PackValueType.Data: return(new PackValue(index, new byte[0])); } return(null); }
// 型のチェック public bool CheckType(PackValueType type) { return(this.type == type); }