示例#1
0
        public void Load()
        {
            if (!File.Exists(FileName))
            {
                throw new FileNotFoundException($"Could not find SHN File {FileName}.");
            }

            byte[] data;
            using (var file = File.Open(FileName, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                var reader = new BinaryReader(file);
                CryptHeader = reader.ReadBytes(32);
                var Length = reader.ReadInt32() - 36; //minus int + header
                data = reader.ReadBytes(Length);
                FileCrypto.Crypt(data, 0, Length);
                //File.WriteAllBytes("Output.dat", data); //debug purpose
            }

            using (var stream = new MemoryStream(data))
            {
                var reader = new SHNReader(stream);
                Header              = reader.ReadUInt32();
                RecordCount         = reader.ReadUInt32();
                DefaultRecordLength = reader.ReadUInt32();
                ColumnCount         = reader.ReadUInt32();
                GenerateColumns(reader);
                GenerateRows(reader);
            }

            data = null;
        }
示例#2
0
        public void Load(SHNReader reader, ref int unkcount)
        {
            var caption = reader.ReadPaddedString(48);

            if (caption.Trim().Length < 2)
            {
                ColumnName = "Undefined " + unkcount;
                ++unkcount;
            }
            else
            {
                ColumnName = caption;
            }

            TypeByte = (byte)reader.ReadUInt32();
            DataType = GetType(TypeByte);
            Length   = reader.ReadInt32();
        }
示例#3
0
        public void GenerateRows(SHNReader reader)
        {
            var values = new object[ColumnCount];

            for (uint i = 0; i < RecordCount; ++i)
            {
                uint RowLength = reader.ReadUInt16();
                for (var j = 0; j < ColumnCount; ++j)
                {
                    switch (((ShnColumn)Columns[j]).TypeByte)
                    {
                    case 1:
                    case 12:
                    case 16:
                        values[j] = reader.ReadByte();
                        break;

                    case 2:
                        values[j] = reader.ReadUInt16();
                        break;

                    case 3:
                    case 11:
                    case 18:
                    case 27:
                        values[j] = reader.ReadUInt32();
                        break;

                    case 5:
                        values[j] = reader.ReadSingle();
                        break;

                    case 9:
                    case 24:
                        values[j] = reader.ReadPaddedString(((ShnColumn)Columns[j]).Length);
                        break;

                    case 13:
                    case 21:
                        values[j] = reader.ReadInt16();
                        break;

                    case 20:
                        values[j] = reader.ReadSByte();
                        break;

                    case 22:
                        values[j] = reader.ReadInt32();
                        break;

                    case 26
                        :     // TODO: Should be read until first null byte, to support more than 1 this kind of column
                        values[j] = reader.ReadPaddedString((int)(RowLength - DefaultRecordLength + 1));
                        break;

                    default:
                        throw new Exception("New column type found");
                    }
                }

                Rows.Add(values);
            }
        }