Exemplo n.º 1
0
        private Dictionary <string, string> readFile(string fileName)
        {
            var header    = new TblHeader();
            var hashNodes = new List <TblHashNode>();
            var nodes     = new Dictionary <string, string>();

            using (var fs = Resources.Instance.OpenResource(fileName))
                using (var br = new BinaryReader(fs))
                {
                    // read header
                    header.CRC             = br.ReadInt16();
                    header.NodesNumber     = br.ReadInt16();
                    header.HashTableSize   = br.ReadInt32();
                    header.Version         = br.ReadByte();
                    header.DataStartOffset = br.ReadInt32();
                    header.HashMaxTries    = br.ReadInt32();
                    header.FileSize        = br.ReadInt32();

                    // skip indices
                    fs.Seek(header.NodesNumber * sizeof(short), SeekOrigin.Current); // 2 - sizeof short

                    // read hashes
                    for (var i = 0; i < header.HashTableSize; i++)
                    {
                        var hNode = new TblHashNode();

                        hNode.Active          = br.ReadByte();
                        hNode.Index           = br.ReadInt16();
                        hNode.HashValue       = br.ReadInt32();
                        hNode.StringKeyOffset = br.ReadInt32();
                        hNode.StringValOffset = br.ReadInt32();
                        hNode.StringValLength = br.ReadInt16();
                        hashNodes.Add(hNode);
                    }
                    // read data
                    for (var i = 0; i < header.HashTableSize; i++)
                    {
                        // entry is not used, i.e. it's deleted
                        if (hashNodes[i].Active == 0)
                        {
                            continue;
                        }

                        fs.Position = hashNodes[i].StringKeyOffset;

                        var key = Encoding.ASCII.GetString(br.ReadBytes(hashNodes[i].StringValOffset - hashNodes[i].StringKeyOffset)).TrimEnd('\0');
                        var val = Encoding.ASCII.GetString(br.ReadBytes(hashNodes[i].StringValLength)).TrimEnd('\0');

                        // ignore collisions
                        // FIXME: may be replace?
                        nodes.TryAdd(key, val);
                    }
                }
            return(nodes);
        }
Exemplo n.º 2
0
        private static Dictionary <string, string> GetStringTable(BinaryReader br, TblHeader header)
        {
            var result    = new Dictionary <string, string>();
            var tableList = new List <TableList>();

            br.BaseStream.Position += header.NodesNumber * sizeof(ushort);
            var hashNodes = new List <TblHashNode>();

            for (uint i = 0; i < header.HashTableSize; i++)
            {
                hashNodes.Add(GetHashNode(br));
            }

            br.BaseStream.Position = 0;

            var byteArray = ReadAllBytes(br);

            foreach (var hashNode in hashNodes)
            {
                if (hashNode.Active == 0)
                {
                    continue;
                }
                else if (hashNode.Active != 1)
                {
                    continue;
                }

                string val = null;
                string key;

                val = Encoding.UTF8.GetString(byteArray, (int)hashNode.StringValOffset, hashNode.StringValLength).Trim('\0');
                key = Encoding.UTF8.GetString(byteArray, (int)hashNode.StringKeyOffset, (int)hashNode.StringValOffset - (int)hashNode.StringKeyOffset).Trim('\0');

                tableList.Add(new TableList {
                    Key = key, Value = val ?? "", Index = hashNode.Index
                });
            }

            tableList = tableList.OrderBy(x => x.Index).ToList();

            foreach (var tableValue in tableList)
            {
                result[tableValue.Key] = tableValue.Value;
            }

            return(result);
        }