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); }
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); }