Пример #1
0
        private void SaveClick(object sender, EventArgs e)
        {
            byte[] temp = new byte[20 * 1024 * 1024];
            using (EndianBinaryWriter writer = new EndianBinaryWriter(new MemoryStream(temp)))
            {
                nodes.Clear();
                values.Clear();
                UpdateStrings(root);
                nodes.Sort(CustomStringSort);
                values.Sort(CustomStringSort);

                nodeChaches.Clear();
                int    len   = SaveTreeToFile(root, writer);
                byte[] bytes = new byte[len];
                for (int i = 0; i < len; i++)
                {
                    bytes[i] = temp[i];
                }

                if (isYaz0)
                {
                    bytes = Yaz0.encode(bytes);
                }

                File.WriteAllBytes(path, bytes);

                writer.Close();
            }
            MessageBox.Show("save successful");
        }
Пример #2
0
        public Byaml(string byamlFile)
        {
            nodes  = new List <string>();
            values = new List <string>();

            nodeChaches = new List <KeyValuePair <int, ShowNode> >();

            searched_nodes = new List <TreeNode>();

            byte[] bytes = File.ReadAllBytes(byamlFile);
            isYaz0 = Yaz0.IsYaz0(bytes);
            if (isYaz0)
            {
                bytes = Yaz0.decode(bytes);
            }

            var stream = new MemoryStream(bytes);
            var reader = new EndianBinaryReader(stream);

            reader.Endianness = Endianness.BigEndian;

            if (reader.ReadUInt16() != 0x4259)
            {
                throw new InvalidDataException();
            }
            if (reader.ReadUInt16() != 0x0002)
            {
                throw new InvalidDataException();
            }

            path = byamlFile;

            uint nodeOffset = reader.ReadUInt32();

            if (nodeOffset > reader.BaseStream.Length)
            {
                throw new InvalidDataException();
            }

            uint valuesOffset = reader.ReadUInt32();

            if (valuesOffset > reader.BaseStream.Length)
            {
                throw new InvalidDataException();
            }

            uint treeOffset = reader.ReadUInt32();

            if (treeOffset > reader.BaseStream.Length)
            {
                throw new InvalidDataException();
            }

            if (nodeOffset != 0)
            {
                reader.BaseStream.Seek(nodeOffset, SeekOrigin.Begin);
                nodes.AddRange(new ByamlNode.StringList(reader).Strings);
            }
            if (valuesOffset != 0)
            {
                reader.BaseStream.Seek(valuesOffset, SeekOrigin.Begin);
                values.AddRange(new ByamlNode.StringList(reader).Strings);
            }

            ByamlNodeType rootType;

            reader.BaseStream.Seek(treeOffset, SeekOrigin.Begin);
            rootType = (ByamlNodeType)reader.ReadByte();
            reader.BaseStream.Seek(-1, SeekOrigin.Current);
            if (rootType == ByamlNodeType.UnamedNode)
            {
                tree = new ByamlNode.UnamedNode(reader);
            }
            else
            {
                tree = new ByamlNode.NamedNode(reader);
            }

            root      = new ShowNode("root");
            root.Type = tree.Type;

            reader.Close();
        }