public override void ReadHeader(BinaryReaderWriter br) { base.ReadCommonHeader(br, Type); br.ReadBytes(Unknown_0x15); // die Header- also Sub-Dateianfänge einlesen for (int i = 0; i < SubHeaderOffsets.Length; i++) { SubHeaderOffsets[i] = br.Read4UInt(); } if (Headerlength > 0x35) { Unknown_0x35 = br.ReadBytes(Headerlength - 0x35); } // echte Sub-Dateiheaderlängen aus dem jeweiligen Sub-Datei-Header einlesen for (int i = 0; i < SubHeaderOffsets.Length; i++) { if (SubHeaderOffsets[i] != 0) { br.Seek(SubHeaderOffsets[i]); SubHeaderLength[i] = br.Read2AsUShort(); } else { SubHeaderLength[i] = 0; } } // Subdateiheaderdistanzen berechnen // - bei SubHeaderOffsets==0 ist auch SubHeaderDistance==0 weil der Header ungültig ist // - beim letzten SubHeader ist SubHeaderDistance==uint.MaxValue, da es nicht anders geht for (int i = 0; i < SubHeaderOffsets.Length; i++) { if (SubHeaderOffsets[i] > 0 && i < SubHeaderOffsets.Length - 1) { // nächsten gültigen Subheader suchen int j = SubHeaderOffsets.Length; for (j = i + 1; j < SubHeaderOffsets.Length; j++) { if (SubHeaderOffsets[j] >= SubHeaderOffsets[i] + SubHeaderLength[i]) { break; } } if (j < SubHeaderOffsets.Length) { SubHeaderDistance[i] = SubHeaderOffsets[j] - SubHeaderOffsets[i]; } } else { SubHeaderDistance[i] = uint.MaxValue; } } }
public void Read(BinaryReaderWriter br) { blocks.Clear(); // 0x0 Used = br.ReadByte() == 0x01; // 0x01 Name = br.ReadString(8); // 0x09 Typ = br.ReadString(3); // 0x0c Filesize = br.Read4UInt(); // 0x10 Flag = br.ReadByte(); // 0x11 Part = br.ReadByte(); // 0x12 Unknown = br.ReadBytes(14); // 0x20 for (int i = 0; i < MaxBlockNumberCount; i++) { UInt16 no = br.Read2AsUShort(); if (no != 0xffff) { blocks.Add(no); } } }
/// <summary> /// lese die Daten aus einer MDX-Datei ein /// </summary> /// <param name="br"></param> public void Read(BinaryReaderWriter br) { br.Seek(0); byte[] id = br.ReadBytes(6); if (id[0] != 'M' || id[1] != 'i' || id[2] != 'd' || id[3] != 'x' || id[4] != 'd' || id[5] != 0) { throw new Exception("Keine MDX-Datei."); } Unknown1 = br.Read2AsUShort(); Unknown2 = br.Read2AsUShort(); Count = br.Read4UInt(); Maps.Clear(); for (int i = 0; i < Count; i++) { MapEntry entry = new MapEntry(); entry.Read(br); Maps.Add(entry); } }
public override void ReadHeader(BinaryReaderWriter br) { base.ReadCommonHeader(br, Type); Filesections.ClearSections(); br.ReadBytes(Unknown_x15); ContentsBlock = new ShortDataBlock(br); if (Headerlength > 0x1D) // i.A. 0x001D; auch 0x25 gesehen mit 8 zusätzlichen Byte: 00 00 35 00 00 00 10 00 { Unknown_x1D = new byte[Headerlength - 0x1D]; br.ReadBytes(Unknown_x1D); } }
public override void ReadHeader(BinaryReaderWriter br) { base.ReadCommonHeader(br, Type); Flags = br.Read4UInt(); ZoomlevelCount = br.Read2AsUShort(); br.ReadBytes(Unknown_0x1B); ZoomlevelRecordSize = br.Read2AsUShort(); PtrZoomlevel = br.Read4UInt(); if (Headerlength == 0x29) { br.ReadBytes(Unknown_0x25); } else { Unknown_0x25 = br.ReadBytes(Headerlength - 0x25); } }
public override void ReadHeader(BinaryReaderWriter br) { base.ReadCommonHeader(br, Type); Nod1Nodes.Read(br); Flags = br.Read2AsUShort(); br.ReadBytes(Unknown_0x1F); Align = br.ReadByte(); Mult1 = br.ReadByte(); TableARecordLen = br.Read2AsUShort(); Nod2RoadData.Read(br); br.ReadBytes(Unknown_0x2D); Nod3BoundaryNodes.Read(br); br.ReadBytes(Unknown_0x3B); if (Headerlength > 0x3F) { Nod4HighClassBoundary.Read(br); // 0x3F, 8Byte for (int i = 0; i < ClassBoundaries.Length; i++) // 0x47, 5*4 Bytes { ClassBoundaries[i] = br.Read4Int(); if (i > 0) { ClassBoundaries[i] += ClassBoundaries[i - 1]; } } br.ReadBytes(Unknown_0x5B); Nod5.Read(br); br.ReadBytes(Unknown_0x6F); Nod6.Read(br); br.ReadBytes(Unknown_0x7B); } }
/// <summary> /// Ab der akt. Position im Stream werden (max.) die gewünschten Anzahl Bytes eingelesen und die vorgegeben Positionsangaben gespeichert. /// </summary> /// <param name="br"></param> /// <param name="newoffset"></param> /// <param name="length"></param> /// <returns>Anzahl der tatsächlich gelesenen Bytes</returns> public uint Read(BinaryReaderWriter br, uint newoffset, uint length) { Position.Offset = newoffset; if (length > 0) { Data = br.ReadBytes((int)length); } else { Data = new byte[0]; } Position.Length = (uint)Data.Length; return(Position.Length); }
/// <summary> /// liest eine Farbtabelle ein /// </summary> /// <param name="br"></param> /// <param name="iCols">Anzahl der Farben in der Tabelle</param> /// <param name="bWithAlpha">Farben mit oder ohne Alphaanteil</param> /// <returns>Farbtabelle</returns> public static Color[] ReadColorTable(BinaryReaderWriter br, int iCols = 1, bool bWithAlpha = false) { Color[] col = new Color[iCols]; if (!bWithAlpha) { for (int i = 0; i < iCols; i++) { byte blue = br.ReadByte(); byte green = br.ReadByte(); byte red = br.ReadByte(); col[i] = Color.FromArgb(red, green, blue); } } else { // Länge der Farbtabelle ermitteln int len = iCols * 3 + iCols / 2; if (iCols % 2 == 1) { len++; } // Farbtabelle einlesen byte[] colortable = br.ReadBytes(len); byte[] halfbytetable = new byte[2 * len]; for (int i = 0; i < len; i++) { halfbytetable[2 * i] = (byte)(colortable[i] & 0xf); halfbytetable[2 * i + 1] = (byte)(colortable[i] >> 4); } for (int i = 0; i < iCols; i++) { byte blue = (byte)(halfbytetable[7 * i] | (halfbytetable[7 * i + 1] << 4)); byte green = (byte)(halfbytetable[7 * i + 2] | (halfbytetable[7 * i + 3] << 4)); byte red = (byte)(halfbytetable[7 * i + 4] | (halfbytetable[7 * i + 5] << 4)); byte alpha = halfbytetable[7 * i + 6]; alpha = (byte)((255 * alpha) / 15); // 0x0..0xf --> 0x0..0xff col[i] = Color.FromArgb(~alpha & 0xff, red, green, blue); } } return(col); }
/// <summary> /// /// </summary> /// <param name="br"></param> /// <param name="dataendpos">Pointer auf das 1. Byte NACH den Höhendaten</param> public void ReadData(BinaryReaderWriter br, uint dataendpos) { int items = (ZoomlevelItem.MaxIdxHoriz + 1) * (ZoomlevelItem.MaxIdxVert + 1); long pos = br.Position; br.Seek(ZoomlevelItem.PtrSubtileTable); List <SubtileTableitem> stilst = new List <SubtileTableitem>(); for (int i = 0; i < items; i++) { stilst.Add(new SubtileTableitem()); stilst[stilst.Count - 1].Read(br, ZoomlevelItem.Structure_OffsetSize, ZoomlevelItem.Structure_BaseheightSize, ZoomlevelItem.Structure_DiffSize, ZoomlevelItem.Structure_CodingtypeSize); } br.Seek(ZoomlevelItem.PtrHeightdata); for (int i = 0; i < stilst.Count; i++) { byte[] data = null; if (stilst[i].Diff > 0) { // Datenlänge: vom akt. Offset bis zum nächsten gültigen Offset int j = i + 1; for (; j < stilst.Count; j++) { if (stilst[j].Offset > 0) { break; } } uint len = j < stilst.Count - 1 ? stilst[j].Offset - stilst[i].Offset : dataendpos - (uint)br.Position; data = br.ReadBytes((int)len); } Subtiles.Add(new Subtile(data, stilst[i])); } br.Seek(pos); }
public void Read(BinaryReaderWriter br) { Headerlength = br.Read2AsUShort(); Id1 = br.Read2AsUShort(); Id2 = br.Read2AsUShort(); Codepage = br.Read2AsUShort(); br.SetEncoding(Codepage); br.ReadBytes(Unknown1); br.ReadBytes(Unknown2); CharTabBlock.Read(br); br.ReadBytes(Unknown3); ExpansionsBlock.Read(br); br.ReadBytes(Unknown4); CharTabOffset = br.Read4UInt(); br.ReadBytes(Unknown5); if (Headerlength > 0x34) { Unknown6 = new byte[Headerlength - 0x34]; br.ReadBytes(Unknown6); } }
/// <summary> /// liest die Daten aus dem Stream /// </summary> /// <param name="br"></param> public void Read(BinaryReaderWriter br) { rawimgdata = br.ReadBytes(rawimgdata.Length); }
public void Read(BinaryReaderWriter br) { // 0x0 /* Before you can look at an IMG file, you must XOR it with the XOR byte (the first byte in the file). Some maps are not XOR’d (the first byte is 0x00). */ br.XOR = XOR = br.ReadByte(); // 0x01 br.ReadBytes(Unknown_x01); // 0x0a UpdateMonth = br.ReadByte(); // 0x0b _UpdateYear = br.ReadByte(); // 0x0c br.ReadBytes(Unknown_x0c); // 0x0e // Mapsource flag, 1 - file created by Mapsource, 0 - Garmin map visible in Basecamp and Homeport MapsourceFlag = br.ReadByte(); /* 0x0f sum % 256 * The checksum at 0xF is calculated by summing all bytes, save for the checksum byte itself, in the * map file and then multiplying by -1. The lowest byte in this product becomes the checksum byte * at 0xF. Note that this checksum is apparently not validated by MapSource, since you can modify * the contents of IMG files directly with a hex editor and they will still work even if the checksum * is not updated. */ Checksum = br.ReadByte(); // 0x10 string tmp = Encoding.ASCII.GetString(br.ReadBytes(SIGNATURE.Length)); if (tmp != SIGNATURE) { throw new Exception("Das ist keine Garmin-IMG-Datei."); } // 0x16 br.ReadBytes(Unknown_x16); // (Size of each FAT, in sectors, for FAT12/16; 0 for FAT32 ) // 0x18 SectorsPerTrack = br.Read2AsUShort(); // 0x1a HeadsPerCylinder = br.Read2AsUShort(); // 0x1c Cylinders = br.Read2AsUShort(); // 0x1e br.ReadBytes(Unknown_x1e); // 0x39 CreationDate = new DateTime(br.Read2AsUShort(), br.ReadByte(), br.ReadByte(), br.ReadByte(), br.ReadByte(), br.ReadByte()); // 0x40 _HeadSectors = br.ReadByte(); // 0x41 tmp = Encoding.ASCII.GetString(br.ReadBytes(MAPFILEIDENTIFIER.Length)); if (tmp != MAPFILEIDENTIFIER) { throw new Exception("Das ist keine Garmin-IMG-Datei."); } // 0x47 br.ReadBytes(Unknown_x47); // 0x49 Description1 = Encoding.ASCII.GetString(br.ReadBytes(20)); // 0x5d HeadsPerCylinder2 = br.Read2AsUShort(); // 0x5f SectorsPerTrack2 = br.Read2AsUShort(); // 0x61 /* Most notable are the two byte values (at 0x61 and 0x62, here named as E1 and E2) which are * used to set the block size for the file. They represent powers of two, and the block size is set via * the formula 2E1+E2 . E1 appears to always be 0x09, setting the minimum block size to 512 bytes. */ BlocksizeExp1 = br.ReadByte(); // 0x62 BlocksizeExp2 = br.ReadByte(); // 0x63 Blocks4Img = br.Read2AsUShort(); // 0x65 Description2 = Encoding.ASCII.GetString(br.ReadBytes(30)); // 0x83 br.ReadBytes(Unknown_x83); // "partition table" // 0x1bf StartHeadNumber4Partition = br.ReadByte(); // 0x1c0 StartSectorNumber4Partition = br.ReadByte(); // 0x1c1 StartCylinderNumber4Partition = br.ReadByte(); // 0x1c2 Systemtyp = br.ReadByte(); // 0x1c3 LastHeadNumber4Partition = br.ReadByte(); // 0x1c4 LastSectorNumber4Partition = br.ReadByte(); // 0x1c5 LastCylinderNumber4Partition = br.ReadByte(); // 0x1c6 RelativeSectors = br.Read4UInt(); // 0x1ca LastSectorNumber4IMG = br.Read4UInt(); // 0x1ce br.ReadBytes(Unknown_x1ce); // 0x1fe if (br.Read2AsUShort() != BOOTSIGNATURE) { throw new Exception("Das ist keine Garmin-IMG-Datei."); } // 0x200 Unknown_x200 = new byte[(_HeadSectors - 1) * SECTOR_BLOCKSIZE]; br.ReadBytes(Unknown_x200); }
public override void ReadHeader(BinaryReaderWriter br) { base.ReadCommonHeader(br, Type); if (Unknown_0x0C != 0x01) // Bedeutung unklar { throw new Exception("Das ist keine Garmin-TYP-Datei."); } Headertyp htyp = Headertyp.Unknown; Codepage = br.Read2AsUShort(); // Infos zu den Datenblöcken für POI, Polyline und Polygon einlesen (Offset, Länge) // (eigentlich uninteressant, da auf die Daten über die entsprechenden Tabellen zugegriffen wird) PointDatablock.Read(br); PolylineDatablock.Read(br); PolygoneDatablock.Read(br); FamilyID = br.Read2AsUShort(); ProductID = br.Read2AsUShort(); // Infos zu den Tabellen für POI, Polyline und Polygon einlesen (Offset, Länge, Länge der Tabelleneinträge) PointTableBlock = new TypDataBlockWithRecordsize(br); PolylineTableBlock = new TypDataBlockWithRecordsize(br); PolygoneTableBlock = new TypDataBlockWithRecordsize(br); PolygoneDraworderTableBlock = new TypDataBlockWithRecordsize(br); htyp = Headertyp.Standard; // ev. kommt noch NT-Zeugs if (Headerlength > 0x5b) // Extra icons { htyp = Headertyp.Type_6E; // spez. Daten für NT1-Punkte NT_PointTableBlock = new TypDataBlockWithRecordsize(br); nt_unknown_0x65 = br.ReadByte(); // sollte wohl immer 0x1F sein (?), auch 0x0D NT_PointDatablock.Read(br); if (Headerlength > 0x6e) // Extra POI Labels { htyp = Headertyp.Type_9C; nt_unknown_0x6E = br.Read4UInt(); // 0 NT_PointLabelblock.Read(br); // Block-Offset und -Länge nt_unknown_0x7A = br.Read4UInt(); // 6 Datensatzlänge? nt_unknown_0x7E = br.Read4UInt(); // 0x1B NT_LabelblockTable1.Read(br); nt_unknown_0x8A = br.Read4UInt(); // 6 nt_unknown_0x8E = br.Read4UInt(); // 0x1B NT_LabelblockTable2.Read(br); nt_unknown_0x9A = br.Read2AsUShort(); // 0x12 if (Headerlength > 0x9C) // Indexing a selection of POIs { htyp = Headertyp.Type_A4; br.ReadBytes(nt_unknown_0x9C); // scheint nochmal der gleiche Datenblock wie LabelblockTable2 zu sein if (Headerlength > 0xA4) // Active Routing { htyp = Headertyp.Type_AE; br.ReadBytes(nt_unknown_0xA4); if (Headerlength > 0xAE) { htyp = Headertyp.Unknown; nt_unknown_0xA4 = br.ReadBytes(Headerlength - (int)br.Position); // Rest einlesen } } } } } _HeaderTyp = htyp; }
public override void ReadHeader(BinaryReaderWriter br) { base.ReadCommonHeader(br, Type); Filesections.ClearSections(); Codepage = br.Read2AsUShort(); br.SetEncoding(Codepage); SortId1 = br.Read2AsUShort(); SortId2 = br.Read2AsUShort(); br.ReadBytes(Unknown_x1B); Mdr1 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_x27); Mdr2 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_x35); Mdr3 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_x43); Mdr4 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_x51); Mdr5 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_x5F); Mdr6 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_x6D); Mdr7 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_x7B); Mdr8 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_x89); Mdr9 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_x97); Mdr10 = new DataBlock(br); br.ReadBytes(Unknown_xA3); Mdr11 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_xB1); Mdr12 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_xBF); Mdr13 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_xCD); Mdr14 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_xDB); Mdr15 = new DataBlock(br); Unknown_xE7 = br.ReadByte(); Mdr16 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_xF2); Mdr17 = new DataBlock(br); br.ReadBytes(Unknown_xFE); Mdr18 = new DataBlockWithRecordsize(br); br.ReadBytes(Unknown_x10C); if (Headerlength > 0x110) { Unknown_x110 = new byte[Headerlength - 0x110]; br.ReadBytes(Unknown_x110); } }