Example #1
0
        private void Load(string fileName)
        {
            var fileBytes = File.ReadAllBytes(fileName);

            using (var ms = new MemoryStream(fileBytes))
            {
                using (var reader = new BinaryReaderExt(ms))
                {
                    reader.ReadBytes(16);
                    var fileCount = reader.ReadInt32();
                    reader.ReadInt32();
                    for (var i = 0; i < fileCount; i++)
                    {
                        var file = new FILE();
                        file.Index = reader.ReadInt32();
                        reader.ReadBytes(21);
                        file.FileName = reader.ReadAscii();
                        file.FileName =
                            file.FileName.Substring(0, file.FileName.IndexOf('\0')); // Otherwise windows will crap out
                        reader.ReadBytes(12);
                        var filePos    = reader.ReadInt32();
                        var fileLength = reader.ReadInt32();

                        var pos = reader.BaseStream.Position;

                        reader.BaseStream.Seek(filePos, SeekOrigin.Begin);
                        file.File = reader.ReadBytes(fileLength);
                        reader.BaseStream.Seek(pos, SeekOrigin.Begin);

                        Files.Add(file);
                    }
                }
            }
        }
Example #2
0
        public void ExtendedBinaryReaderTest()
        {
            var testBytes = new byte[]
            {
                0x15, 0x00, 0x00, 0x00, // Size
                0x02, 0x00, 0x00, 0x00, // Id
                0x03, 0x00, 0x00, 0x00, // Type
                0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64, 0x00,
                0x00,
            };

            using (var ms = new MemoryStream(testBytes))
            {
                using (var reader = new BinaryReaderExt(ms))
                {
                    var sizeTestValue = reader.ReadInt32LittleEndian();
                    Assert.Equal(21, sizeTestValue);
                    var idTestValue = reader.ReadInt32LittleEndian();
                    Assert.Equal(2, idTestValue);
                    var typeTestValue = reader.ReadInt32LittleEndian();
                    Assert.Equal(3, typeTestValue);
                    var payloadTestValue = reader.ReadAscii();
                    Assert.Equal("Hello World", payloadTestValue);
                }
            }
        }
Example #3
0
        public RemoteConPacket(byte[] packetBytes, bool useUtf8 = false)
        {
            if (useUtf8)
            {
                _packetEncoding = Encoding.UTF8;
            }

            using (var ms = new MemoryStream(packetBytes))
            {
                using (var reader = new BinaryReaderExt(ms))
                {
                    Size = reader.ReadInt32LittleEndian();

                    // The size field (4-Bytes Little Endian Int) is, according to specification, not included.
                    if (Size + 4 != packetBytes.Length)
                    {
                        throw new LengthMismatchException("packet length mismatch");
                    }

                    Id = reader.ReadInt32LittleEndian();

                    var packetType = reader.ReadInt32LittleEndian();
                    if (!Enum.IsDefined(typeof(PacketType), packetType))
                    {
                        throw new InvalidPacketTypeException("Invalid packet type");
                    }
                    Type = (PacketType)Enum.ToObject(typeof(PacketType), packetType);

                    if (!useUtf8)
                    {
                        Payload = reader.ReadAscii();

                        // Get payload length by subtracting 9 bytes (ID 4-Bytes, Type 4-Bytes, Null-terminator 1-Byte)
                        if (Encoding.ASCII.GetByteCount(Payload) > Size - 9)
                        {
                            throw new LengthMismatchException("Payload length mismatch");
                        }
                    }
                    else
                    {
                        Payload = Encoding.UTF8.GetString(reader.ReadBytes(Size - 10));
                        reader.ReadByte();
                    }

                    var nullTerminator = reader.ReadByte();
                    if (nullTerminator != 0x00)
                    {
                        throw new NullTerminatorMissingException("Missing last null-terminator");
                    }

                    if (reader.BaseStream.Position != reader.BaseStream.Length)
                    {
                        throw new Exception("More data to read");
                    }
                }
            }
        }
Example #4
0
        public TCS(string filePath)
        {
            using (var stream = File.OpenRead(filePath))
                using (var reader = new BinaryReaderExt(stream))
                {
                    var identifier = reader.ReadAscii();
                    if (identifier != "TCS\0")
                    {
                        throw new UnknownFileFormatException();
                    }

                    var header = reader.ReadAscii();
                    if (header != "B\0") // Only binary TCS is supported.
                    {
                        throw new NotSupportedException();
                    }

                    FileVersion = reader.ReadInt32();

                    var fileDate = DateTime.ParseExact(FileVersion.ToString(), "yyyyMMdd", CultureInfo.InvariantCulture);
                    FileDay   = fileDate.Day;
                    FileMonth = fileDate.Month;
                    FileYear  = fileDate.Year;

                    //Console.WriteLine($@"Version: {FileVersion}");
                    if (FileVersion != 20080327)
                    {
                        Console.WriteLine(@"Version different. Output may be wrong!");
                    }

                    var identifier2 = reader.ReadAscii();
                    //Console.WriteLine($@"Identifier: {identifier2}");

                    Console.WriteLine(reader.ReadAscii()); // ?? (NHN-AG) (Maybe refers to NHN Corp?)
                    Console.WriteLine(reader.ReadAscii()); // ?? (JC)

                    // Chunk. (for whole file)
                    while (reader.BaseStream.Position != reader.BaseStream.Length)
                    {
                        var id  = reader.ReadInt32(); // Id?
                        var len = reader.ReadInt32(); // Len?
                        //Console.WriteLine($"Id: {id} ({Enum.GetName(typeof(TCCHUNK_ENUM), id)}), Len: {len}");
                        switch ((TCCHUNK_ENUM)id)
                        {
                        /*default:
                         * case TCCHUNK_ENUM.TCCHUNK_MAIN: // 0x5
                         * case TCCHUNK_ENUM.TCCHUNK_NATEDRV: // 0x1000
                         * case TCCHUNK_ENUM.TCCHUNK_CROSSES: // 0x10000
                         * case TCCHUNK_ENUM.TCCHUNK_ROADS: // 0x20000
                         * case TCCHUNK_ENUM.TCCHUNK_CROSSROADS: // 0x50000
                         * case TCCHUNK_ENUM.TCCHUNK_PATHS: // 0x70000
                         * case TCCHUNK_ENUM.TCCHUNK_JOINTS: // 0x75000
                         * case TCCHUNK_ENUM.TCCHUNK_TIMEKEYDATAS: // 0x90000
                         * case TCCHUNK_ENUM.TCCHUNK_SIGNALS: // 0xA0000
                         * case TCCHUNK_ENUM.TCCHUNK_CROSSSIGNALS: // 0xA5000
                         * case TCCHUNK_ENUM.TCCHUNK_SIGNAL4CLS: // 0xA6000
                         *  // Ignored?
                         * break;*/

                        case TCCHUNK_ENUM.TCCHUNK_NATEDRVINFO: // 0x1100
                            ReadNdNodeInfo(reader);            //TcTcsReader::ReadNdNodeInfo
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_NDNODEINFO: // 0x2000
                            ReadNdNodeInfo(reader);           //TcTcsReader::ReadNdNodeInfo
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_NDNODE: // 0x2100
                            ReadNdNode(reader);           //TcTcsReader::ReadNdNode
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_NDPATHINFO: // 0x3000
                            ReadNdNodeInfo(reader);           //TcTcsReader::ReadNdNodeInfo
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_NDPATH: // 0x3100
                            ReadNdPath(reader);           //TcTcsReader::ReadNdPath
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_NDARCINFO: // 0x4000
                            ReadNdNodeInfo(reader);          //TcTcsReader::ReadNdNodeInfo
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_NDARC: // 0x4100
                            ReadNdArc(reader);           //TcTcsReader::ReadNdArc
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_CROSSESINFO: // 0x11000
                            CrossesInfoReader(reader);         //TcTcsReader::CrossesInfoReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_CROSS: // 0x12200
                            CrossReader(reader);         //TcTcsReader::CrossReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_ROADSINFO: // 0x20100
                            RoadsInfoReader(reader);         //TcTcsReader::RoadsInfoReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_ROAD: // 0x20200
                            RoadReader(reader);         //TcTcsReader::RoadReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_CROSSROADSINFO: // 0x50100
                            CrossRoadsInfoReader(reader);         //TcTcsReader::CrossRoadsInfoReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_CROSSROAD: // 0x50200
                            CrossRoadReader(reader);         //TcTcsReader::CrossRoadReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_PATHSINFO: // 0x70100
                            PathsInfoReader(reader);         //TcTcsReader::PathsInfoReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_PATH: // 0x70200
                            PathReader(reader);         //TcTcsReader::PathReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_PATH4S: // 0x70300
                            Path4SReader(reader);         //TcTcsReader::Path4SReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_JOINTSINFO: // 0x75100
                            JointsInfoReader(reader);         //TcTcsReader::JointsInfoReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_JOINT: // 0x75200
                            JointReader(reader);         //TcTcsReader::JointReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_TIMEKEYDATASINFO: // 0x90010
                            TimeKeyDatasInfoReader(reader);         //TcTcsReader::TimeKeyDatasInfoReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_TIMEKEYDATA: // 0x90020
                            TimeKeyDataReader(reader);         //TcTcsReader::TimeKeyDataReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_SIGNALSINFO: // 0xA0010
                            SignalsInfoReader(reader);         //TcTcsReader::SignalsInfoReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_SIGNAL: // 0xA0030
                            SignalReader(reader);         //TcTcsReader::SignalReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_SIGNALCONTROL: // 0xA0040
                            SignalControlReader(reader);         //TcTcsReader::SignalControlReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_CROSSSIGNALSINFO: // 0xA5010
                            CrossSignalsInfoReader(reader);         //TcTcsReader::CrossSignalsInfoReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_CROSSSIGNAL: // 0xA5030
                            CrossSignalReader(reader);         //TcTcsReader::CrossSignalReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_SIGNAL4CLCTL: // 0xA6010
                            Signals4CLCtlReader(reader);        //TcTcsReader::Signals4CLCtlReader
                            break;

                        case TCCHUNK_ENUM.TCCHUNK_SIGNAL4CL: // 0xA6030
                            Signals4CLReader(reader);        //TcTcsReader::Signals4CLReader
                            break;
                        }
                    }
                }
        }