コード例 #1
0
ファイル: DataRGN.cs プロジェクト: FSofTlpz/GMExplorer
        static void ShowExtLineInfo(StringBuilder info,
                                    AllSubdivInfo asi,
                                    GarminCore.Files.StdFile_RGN rgn,
                                    TreeViewData tvd,
                                    NodeContent.Content4File filedata,
                                    int lineidx,
                                    int tab,
                                    out int hexlen,
                                    out long firsthexadr)
        {
            GarminCore.Files.StdFile_RGN.ExtRawPolyData poly = asi.GetExtLine(lineidx);
            GarminCore.DataBlock block = asi.GetDataBlock4ExtLine(lineidx);

            firsthexadr  = rgn.ExtLinesBlock.Offset;
            firsthexadr += block.Offset;
            hexlen       = (int)block.Length;

            info.AppendLine(FillWithSpace("Type             (1 Byte) (Bit 0..6)", tab, false, DecimalAndHexAndBinary(poly.Type)));
            info.AppendLine(FillWithSpace("Subtype          (1 Byte) (Bit 0..4)", tab, false, DecimalAndHexAndBinary(poly.Subtype)));
            info.AppendLine(FillWithSpace("HasLabel                  (Bit 5)", tab, false, poly.HasLabel.ToString()));
            info.AppendLine(FillWithSpace("HasUnknownFlag            (Bit 6)", tab, false, poly.HasUnknownFlag.ToString()));
            info.AppendLine(FillWithSpace("HasExtraBytes             (Bit 7)", tab, false, poly.HasExtraBytes.ToString()));
            info.AppendLine(FillWithSpace("DeltaLongitude   (2 Byte)", tab, false, DecimalAndHexAndBinary((short)poly.RawDeltaLongitude.Value) + ", " + poly.RawDeltaLongitude.ValueDegree.ToString() + "°"));
            info.AppendLine(FillWithSpace("DeltaLatitude    (2 Byte)", tab, false, DecimalAndHexAndBinary((short)poly.RawDeltaLatitude.Value) + ", " + poly.RawDeltaLatitude.ValueDegree.ToString() + "°"));
            info.AppendLine(FillWithSpace("RawBitStreamLengthBytes (" + poly.RawBitStreamLengthBytes.Length.ToString() + " Byte)", tab, false, HexString(poly.RawBitStreamLengthBytes)));
            info.AppendLine(FillWithSpace("   BitStreamLength", tab, false, poly.BitstreamLength.ToString()));
            info.AppendLine(FillWithSpace("BitstreamInfo    (1 Byte)", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo)));
            info.AppendLine(FillWithSpace("   basebits4lat", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo >> 4)));
            info.AppendLine(FillWithSpace("   basebits4lon", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo & 0xF)));
            if (poly.HasLabel)
            {
                info.AppendLine(FillWithSpace("LabelOffsetInLBL (3 Byte) (Bit 0..21)", tab, false, DecimalAndHexAndBinary(poly.LabelOffsetInLBL)));
                GarminCore.Files.StdFile_LBL lbl = tvd.GetLBL(filedata.Basename);
                if (lbl != null)
                {
                    info.AppendLine(FillWithSpace("   Text (from LBL)", tab, true, lbl.GetText(poly.LabelOffsetInLBL, true) + "'"));
                }
            }
            if (poly.HasExtraBytes)
            {
                int len = 7 + poly.RawBitStreamLengthBytes.Length;
                if (poly.HasLabel)
                {
                    len += 3;
                }
                filedata.BinaryReader.Seek(block.Offset + (uint)len);
                info.AppendLine(FillWithSpace("ExtraBytes", tab, false, HexString(filedata.BinaryReader.ReadBytes((int)block.Length - len))));
            }
            info.AppendLine("Deltas:");
            List <GarminCore.Files.StdFile_RGN.GeoDataBitstream.RawPoint> points = poly.GetRawPoints();

            for (int i = 0; i < points.Count; i++)
            {
                info.AppendLine("   " + points[i].ToString() + " / " + points[0].GetMapUnitPoint(rgn.TREFile.MaplevelList[asi.MaplevelNo].CoordBits, asi.SubdivfInfo.Center).ToString());
            }
        }
コード例 #2
0
ファイル: DataRGN.cs プロジェクト: FSofTlpz/GMExplorer
        static void ShowExtPointInfo(StringBuilder info,
                                     AllSubdivInfo asi,
                                     GarminCore.Files.StdFile_RGN rgn,
                                     TreeViewData tvd,
                                     NodeContent.Content4File filedata,
                                     int pointidx,
                                     int tab,
                                     out int hexlen,
                                     out long firsthexadr)
        {
            GarminCore.Files.StdFile_RGN.ExtRawPointData point = asi.GetExtPoint(pointidx);
            GarminCore.DataBlock block = asi.GetDataBlock4ExtPoint(pointidx);

            firsthexadr  = rgn.ExtLinesBlock.Offset;
            firsthexadr += block.Offset;
            hexlen       = (int)block.Length;

            info.AppendLine(FillWithSpace("Type             (1 Byte) (Bit 0..6)", tab, false, DecimalAndHexAndBinary(point.Type)));
            info.AppendLine(FillWithSpace("Subtype          (1 Byte) (Bit 0..4)", tab, false, DecimalAndHexAndBinary(point.Subtype)));
            info.AppendLine(FillWithSpace("HasLabel                  (Bit 5)", tab, false, point.HasLabel.ToString()));
            info.AppendLine(FillWithSpace("HasUnknownFlag            (Bit 6)", tab, false, point.HasUnknownFlag.ToString()));
            info.AppendLine(FillWithSpace("HasExtraBytes             (Bit 7)", tab, false, point.HasExtraBytes.ToString()));
            info.AppendLine(FillWithSpace("DeltaLongitude   (2 Byte)", tab, false, DecimalAndHexAndBinary((short)point.RawDeltaLongitude.Value) + ", " + point.RawDeltaLongitude.ValueDegree.ToString() + "°"));
            info.AppendLine(FillWithSpace("DeltaLatitude    (2 Byte)", tab, false, DecimalAndHexAndBinary((short)point.RawDeltaLatitude.Value) + ", " + point.RawDeltaLatitude.ValueDegree.ToString() + "°"));
            if (point.HasLabel)
            {
                info.AppendLine(FillWithSpace("LabelOffsetInLBL (3 Byte) (Bit 0..21)", tab, false, DecimalAndHexAndBinary(point.LabelOffsetInLBL)));
                GarminCore.Files.StdFile_LBL lbl = tvd.GetLBL(filedata.Basename);
                if (lbl != null)
                {
                    info.AppendLine(FillWithSpace("   Text (from LBL)", tab, true, lbl.GetText(point.LabelOffsetInLBL, true)));
                }
            }
            if (point.HasExtraBytes)
            {
                int len = 6;
                if (point.HasLabel)
                {
                    len += 3;
                }
                filedata.BinaryReader.Seek(firsthexadr + (uint)len);
                info.AppendLine(FillWithSpace("ExtraBytes", tab, false, HexString(filedata.BinaryReader.ReadBytes(point.ExtraBytes))));
            }
            if (point.HasUnknownFlag)
            {
                info.AppendLine(FillWithSpace("UnknownKey", tab, false, HexString(point.UnknownKey)));
                if (point.UnknownBytes != null && point.UnknownBytes.Length > 0)
                {
                    info.AppendLine(FillWithSpace("UnknownBytes", tab, false, HexString(point.UnknownBytes)));
                }
            }
        }
コード例 #3
0
ファイル: DataTRE.cs プロジェクト: FSofTlpz/GMExplorer
        /// <summary>
        /// Funktion für alle TRE-Datei-Infos
        /// </summary>
        /// <param name="info"></param>
        /// <param name="hex"></param>
        /// <param name="firsthexadr"></param>
        /// <param name="filedata"></param>
        /// <param name="nodetype">"Thema" der Info</param>
        /// <param name="idx">wenn größer oder gleich 0, dann der Index auf ein Objekt einer Tabelle</param>
        /// <param name="tn"></param>
        public static void SectionAndIndex(StringBuilder info, out byte[] hex, out long firsthexadr, NodeContent.Content4File filedata, NodeContent.NodeType nodetype, int idx, TreeViewData tvd)
        {
            GarminCore.Files.StdFile_TRE tre = filedata.GetGarminFileAsTRE();
            int hexlen = 0;

            firsthexadr = 0;
            hex         = null;
            GarminCore.Files.StdFile_LBL lbl;
            GarminCore.DataBlock         block;

            switch (nodetype)
            {
            case NodeContent.NodeType.TRE_DescriptionList:
                firsthexadr = tre.MapDescriptionBlock.Offset;
                if (idx < 0)
                {
                    info.AppendLine("MapDescriptionList: " + tre.MapDescriptionList.Count.ToString());
                    info.AppendLine("  Block:            " + tre.MapDescriptionBlock.ToString());
                    hexlen = (int)tre.MapDescriptionBlock.Length;
                }
                else
                {
                    string mapdescription = tre.MapDescriptionList[idx];
                    info.AppendLine("MapDescription: " + tre.MapDescriptionList[idx]);
                    for (int i = 0; i < idx; i++)
                    {
                        firsthexadr += tre.MapDescriptionList[i].Length + 1;
                    }
                    hexlen = tre.MapDescriptionList[idx].Length + 1;
                }
                break;

            case NodeContent.NodeType.TRE_MaplevelBlock:
                firsthexadr = tre.MaplevelBlock.Offset;
                if (idx < 0)
                {
                    info.AppendLine("Maplevel: " + tre.MaplevelList.Count.ToString());
                    info.AppendLine("  Block:  " + tre.MaplevelBlock.ToString());
                    hexlen = (int)tre.MaplevelBlock.Length;
                    if (hexlen > 0 && tre.MaplevelList.Count == 0)
                    {
                        info.AppendLine("data propably encrypted");
                    }
                }
                else
                {
                    GarminCore.Files.StdFile_TRE.MapLevel maplevel = tre.MaplevelList[idx];
                    info.AppendLine("SymbolicScaleDenominator (Bit 0..3):         " + DecimalAndHexAndBinary((ulong)maplevel.SymbolicScaleDenominator));
                    info.AppendLine("(SymbolicScaleDenominator) Bit 4:            " + maplevel.Bit4.ToString());
                    info.AppendLine("(SymbolicScaleDenominator) Bit 5:            " + maplevel.Bit5.ToString());
                    info.AppendLine("(SymbolicScaleDenominator) Bit 6:            " + maplevel.Bit6.ToString());
                    info.AppendLine("(SymbolicScaleDenominator) Bit 7, Inherited: " + maplevel.Inherited.ToString());
                    info.AppendLine("CoordBits (1 Byte):                          " + DecimalAndHexAndBinary((ulong)maplevel.CoordBits));
                    info.AppendLine("SubdivInfos (2 Byte):                        " + DecimalAndHexAndBinary(maplevel.SubdivInfos));
                    firsthexadr += idx * 4;
                    hexlen       = 4;
                }
                break;

            case NodeContent.NodeType.TRE_SubdivisionBlock:
                firsthexadr = tre.SubdivisionBlock.Offset;
                if (idx < 0)
                {
                    info.AppendLine("Subdivision: " + tre.SubdivInfoList.Count.ToString());
                    info.AppendLine("  Block:     " + tre.SubdivisionBlock.ToString());
                    hexlen = (int)tre.SubdivisionBlock.Length;
                    if (hexlen > 0 && tre.MaplevelList.Count == 0)
                    {
                        info.AppendLine("data propably encrypted");
                    }
                }
                else
                {
                    block        = SampleInfo4SubdivInfo(info, tre, idx);
                    firsthexadr += block.Offset;
                    hexlen       = (int)block.Length;
                }
                break;

            case NodeContent.NodeType.TRE_CopyrightBlock:
                firsthexadr = tre.CopyrightBlock.Offset;
                if (idx < 0)
                {
                    info.AppendLine("Copyrights: " + tre.CopyrightOffsetsList.Count.ToString());
                    info.AppendLine("  Block:    " + tre.CopyrightBlock.ToString());
                    hexlen = (int)tre.CopyrightBlock.Length;
                }
                else
                {
                    info.AppendLine("Offset in LBL (" + tre.CopyrightBlock.Recordsize.ToString() + " Byte): " + DecimalAndHexAndBinary(tre.CopyrightOffsetsList[idx]));
                    lbl = tvd.GetLBL(filedata.Basename);
                    if (lbl != null)
                    {
                        info.AppendLine("   Text (from LBL): '" + lbl.GetText(tre.CopyrightOffsetsList[idx], true) + "'");
                    }
                    firsthexadr += idx * tre.CopyrightBlock.Recordsize;
                    hexlen       = tre.CopyrightBlock.Recordsize;
                }
                break;

            case NodeContent.NodeType.TRE_LineOverviewBlock:
                firsthexadr = tre.LineOverviewBlock.Offset;
                if (idx < 0)
                {
                    info.AppendLine("LineOverview: " + (tre.LineOverviewBlock.Length / tre.LineOverviewBlock.Recordsize).ToString());
                    info.AppendLine("  Block:      " + tre.LineOverviewBlock.ToString());
                    hexlen = (int)tre.LineOverviewBlock.Length;
                }
                else
                {
                    GarminCore.Files.StdFile_TRE.OverviewObject2Byte ov = tre.LineOverviewList[idx];
                    info.AppendLine("Type     (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.Type));
                    info.AppendLine("MaxLevel (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.MaxLevel));
                    if (ov is GarminCore.Files.StdFile_TRE.OverviewObject3Byte ||
                        ov is GarminCore.Files.StdFile_TRE.OverviewObject4Byte)
                    {
                        info.AppendLine("SubType  (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject3Byte).SubType));
                    }
                    if (ov is GarminCore.Files.StdFile_TRE.OverviewObject4Byte)
                    {
                        info.AppendLine("Unknown  (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject4Byte).Unknown));
                    }

                    firsthexadr += idx * tre.LineOverviewBlock.Recordsize;
                    hexlen       = tre.LineOverviewBlock.Recordsize;
                }
                break;

            case NodeContent.NodeType.TRE_AreaOverviewBlock:
                firsthexadr = tre.AreaOverviewBlock.Offset;
                if (idx < 0)
                {
                    info.AppendLine("AreaOverview: " + (tre.AreaOverviewBlock.Length / tre.AreaOverviewBlock.Recordsize).ToString());
                    info.AppendLine("  Block:      " + tre.AreaOverviewBlock.ToString());
                    hexlen = (int)tre.AreaOverviewBlock.Length;
                }
                else
                {
                    GarminCore.Files.StdFile_TRE.OverviewObject2Byte ov = tre.AreaOverviewList[idx];
                    info.AppendLine("Type     (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.Type));
                    info.AppendLine("MaxLevel (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.MaxLevel));
                    if (ov is GarminCore.Files.StdFile_TRE.OverviewObject3Byte ||
                        ov is GarminCore.Files.StdFile_TRE.OverviewObject4Byte)
                    {
                        info.AppendLine("SubType (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject3Byte).SubType));
                    }
                    if (ov is GarminCore.Files.StdFile_TRE.OverviewObject4Byte)
                    {
                        info.AppendLine("Unknown (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject4Byte).Unknown));
                    }

                    firsthexadr = idx * tre.AreaOverviewBlock.Recordsize;
                    hexlen      = tre.AreaOverviewBlock.Recordsize;
                }
                break;

            case NodeContent.NodeType.TRE_PointOverviewBlock:
                firsthexadr = tre.PointOverviewBlock.Offset;
                if (idx < 0)
                {
                    info.AppendLine("PointOverview: " + (tre.PointOverviewBlock.Length / tre.PointOverviewBlock.Recordsize).ToString());
                    info.AppendLine("  Block:       " + tre.PointOverviewBlock.ToString());
                    hexlen = (int)tre.PointOverviewBlock.Length;
                }
                else
                {
                    GarminCore.Files.StdFile_TRE.OverviewObject2Byte ov = tre.PointOverviewList[idx];
                    info.AppendLine("Type     (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.Type));
                    info.AppendLine("MaxLevel (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.MaxLevel));
                    if (ov is GarminCore.Files.StdFile_TRE.OverviewObject3Byte ||
                        ov is GarminCore.Files.StdFile_TRE.OverviewObject4Byte)
                    {
                        info.AppendLine("SubType (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject3Byte).SubType));
                    }
                    if (ov is GarminCore.Files.StdFile_TRE.OverviewObject4Byte)
                    {
                        info.AppendLine("Unknown (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject4Byte).Unknown));
                    }

                    firsthexadr = idx * tre.PointOverviewBlock.Recordsize;
                    hexlen      = tre.PointOverviewBlock.Recordsize;
                }
                break;

            case NodeContent.NodeType.TRE_ExtTypeOffsetsBlock:
                firsthexadr = tre.ExtTypeOffsetsBlock.Offset;
                if (idx < 0)
                {
                    info.AppendLine("ExtTypeOffsets: " + (tre.ExtTypeOffsetsBlock.Length / tre.ExtTypeOffsetsBlock.Recordsize).ToString());
                    info.AppendLine("  Block:        " + tre.ExtTypeOffsetsBlock.ToString());
                    hexlen = (int)tre.ExtTypeOffsetsBlock.Length;
                }
                else
                {
                    firsthexadr += idx * tre.ExtTypeOffsetsBlock.Recordsize;
                    hexlen       = tre.ExtTypeOffsetsBlock.Recordsize;

                    GarminCore.Files.StdFile_TRE.ExtendedTypeOffsets extoffs = new GarminCore.Files.StdFile_TRE.ExtendedTypeOffsets();
                    filedata.BinaryReader.Seek(firsthexadr);
                    extoffs.Read(filedata.BinaryReader, tre.ExtTypeOffsetsBlock.Recordsize);
                    info.AppendLine("Offsets in RGN for each Subdiv");
                    info.AppendLine("AreasOffset  (4 Byte): " + DecimalAndHexAndBinary((ulong)extoffs.AreasOffset));
                    info.AppendLine("LinesOffset  (4 Byte): " + DecimalAndHexAndBinary((ulong)extoffs.LinesOffset));
                    info.AppendLine("PointsOffset (4 Byte): " + DecimalAndHexAndBinary((ulong)extoffs.PointsOffset));
                    if (extoffs.DataLength > 12)
                    {
                        info.AppendLine("Kinds (1 Byte): " + DecimalAndHexAndBinary((ulong)extoffs.Kinds));
                    }
                }
                break;

            case NodeContent.NodeType.TRE_ExtTypeOverviewsBlock:
                firsthexadr = tre.ExtTypeOverviewsBlock.Offset;
                if (idx < 0)
                {
                    info.AppendLine("TRE_ExtTypeOverviews: " + (tre.ExtTypeOverviewsBlock.Length / tre.ExtTypeOverviewsBlock.Recordsize).ToString());
                    info.AppendLine("  Block:              " + tre.ExtTypeOverviewsBlock.ToString());
                    info.AppendLine("ExtLineOverviewList:  " + tre.ExtLineOverviewList.Count.ToString());
                    info.AppendLine("ExtAreaOverviewList:  " + tre.ExtAreaOverviewList.Count.ToString());
                    info.AppendLine("ExtPointOverviewList: " + tre.ExtPointOverviewList.Count.ToString());
                    hexlen = (int)tre.ExtTypeOverviewsBlock.Length;
                }
                else
                {
                    firsthexadr += idx * tre.ExtTypeOverviewsBlock.Recordsize;
                    hexlen       = tre.ExtTypeOverviewsBlock.Recordsize;

                    GarminCore.Files.StdFile_TRE.OverviewObject2Byte ov = null;
                    if (idx < tre.ExtLineCount && idx < tre.ExtLineOverviewList.Count)
                    {
                        info.AppendLine("ExtLine");
                        ov = tre.ExtLineOverviewList[idx];
                    }
                    else if (idx < tre.ExtLineCount + tre.ExtAreaCount && idx - tre.ExtLineOverviewList.Count < tre.ExtAreaOverviewList.Count)
                    {
                        idx -= tre.ExtLineCount;
                        info.AppendLine("ExtArea");
                        ov = tre.ExtAreaOverviewList[idx];
                    }
                    else if (idx - tre.ExtLineOverviewList.Count - tre.ExtAreaOverviewList.Count < tre.ExtPointOverviewList.Count)
                    {
                        idx -= tre.ExtLineCount + tre.ExtAreaCount;
                        info.AppendLine("ExtPoint");
                        ov = tre.ExtPointOverviewList[idx];
                    }
                    if (ov != null)
                    {
                        info.AppendLine("Type     (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.Type));
                        info.AppendLine("MaxLevel (1 Byte): " + DecimalAndHexAndBinary((ulong)ov.MaxLevel));
                        info.AppendLine("SubType  (1 Byte): " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject3Byte).SubType));
                        if (ov is GarminCore.Files.StdFile_TRE.OverviewObject4Byte)
                        {
                            info.AppendLine("Unknown (1 Byte):  " + DecimalAndHexAndBinary((ulong)(ov as GarminCore.Files.StdFile_TRE.OverviewObject4Byte).Unknown));
                        }
                    }
                }
                break;

            case NodeContent.NodeType.TRE_UnknownBlock_xAE:
                if (idx < 0)
                {
                    info.AppendLine("UnknownBlock 0xAE: " + tre.UnknownBlock_xAE.ToString());
                    firsthexadr = tre.UnknownBlock_xAE.Offset;
                    hexlen      = (int)tre.UnknownBlock_xAE.Length;
                }
                else
                {
                }
                break;

            case NodeContent.NodeType.TRE_UnknownBlock_xBC:
                if (idx < 0)
                {
                    info.AppendLine("UnknownBlock 0xBC: " + tre.UnknownBlock_xBC.ToString());
                    firsthexadr = tre.UnknownBlock_xAE.Offset;
                    hexlen      = (int)tre.UnknownBlock_xAE.Length;
                }
                else
                {
                }
                break;

            case NodeContent.NodeType.TRE_UnknownBlock_xE3:
                if (idx < 0)
                {
                    info.AppendLine("UnknownBlock 0xE3: " + tre.UnknownBlock_xE3.ToString());
                    firsthexadr = tre.UnknownBlock_xAE.Offset;
                    hexlen      = (int)tre.UnknownBlock_xAE.Length;
                }
                else
                {
                }
                break;

            default:
                info.AppendLine("internal error: no info for nodetype '" + nodetype.ToString() + "'");
                break;
            }

            if (hexlen > 0)
            {
                hex = HexRange(firsthexadr, filedata.BinaryReader, hexlen);
            }
        }
コード例 #4
0
ファイル: DataRGN.cs プロジェクト: FSofTlpz/GMExplorer
        /// <summary>
        /// Funktion für alle RGN-Datei-Infos
        /// </summary>
        /// <param name="info"></param>
        /// <param name="hex"></param>
        /// <param name="firsthexadr"></param>
        /// <param name="filedata"></param>
        /// <param name="nodetype"></param>
        /// <param name="idx"></param>
        /// <param name="tvd"></param>
        public static void SectionAndIndex(StringBuilder info, out byte[] hex, out long firsthexadr, NodeContent.Content4File filedata, NodeContent.NodeType nodetype, int idx, TreeViewData tvd)
        {
            GarminCore.Files.StdFile_RGN rgn = filedata.GetGarminFileAsRGN(tvd.GetTRE(filedata.Basename));
            int hexlen = 0;

            firsthexadr = 0;
            hex         = null;
            AllSubdivInfo asi = null;

            switch (nodetype)
            {
            case NodeContent.NodeType.RGN_PostHeaderData:
                firsthexadr = rgn.PostHeaderDataBlock.Offset;
                if (idx < 0)
                {
                    info.AppendLine("PostHeaderDataBlock: " + rgn.PostHeaderDataBlock.ToString());
                    hexlen = (int)rgn.PostHeaderDataBlock.Length;
                }
                break;

            case NodeContent.NodeType.RGN_SubdivContentBlock:
                firsthexadr = rgn.SubdivContentBlock.Offset;
                if (idx < 0)
                {
                    int tab = 22;
                    info.AppendLine(FillWithSpace("SubdivContent", tab, false, rgn.SubdivList.Count.ToString()));
                    info.AppendLine(FillWithSpace("  Block", tab, false, rgn.SubdivContentBlock.ToString()));
                    hexlen = (int)rgn.SubdivContentBlock.Length;
                    if (hexlen > 0 && rgn.SubdivList.Count == 0)
                    {
                        info.AppendLine("data propably encrypted");
                    }
                }
                else
                {
                    asi = new AllSubdivInfo(rgn, filedata.BinaryReader, idx);

                    info.AppendLine("Info from TRE:");
                    DataTRE.SampleInfo4SubdivInfo(info, rgn.TREFile, idx);
                    info.AppendLine();

                    info.AppendLine("Info from RGN:");
                    GarminCore.DataBlock block = SampleInfo4SubdivData(info, rgn, asi);
                    firsthexadr += block.Offset;
                    hexlen       = (int)block.Length;
                }
                break;

            case NodeContent.NodeType.RGN_ExtAreasBlock:
                firsthexadr = rgn.ExtAreasBlock.Offset;
                if (idx < 0)
                {
                    info.AppendLine("ExtAreas");
                    info.AppendLine("  Block:  " + rgn.ExtAreasBlock.ToString());
                    hexlen = (int)rgn.ExtAreasBlock.Length;
                }
                else
                {
                    int subdividx = -1;
                    int count     = 0;
                    idx &= RGN_IDX_MASK; // Gesamt-Index des ExtArea
                    for (subdividx = 0; subdividx < rgn.SubdivList.Count; subdividx++)
                    {
                        count += rgn.SubdivList[subdividx].ExtAreaList.Count;
                        if (idx < count)
                        {
                            break;
                        }
                    }
                    if (subdividx < rgn.SubdivList.Count)
                    {
                        asi = new AllSubdivInfo(rgn, filedata.BinaryReader, subdividx);
                        int idx2 = asi.SubdivData.ExtAreaList.Count - (count - idx);
                        info.AppendLine("ExtArea " + idx2.ToString() + " from Subdiv " + subdividx.ToString());
                        ShowExtAreaInfo(info, asi, rgn, tvd, filedata, idx2, 40, out hexlen, out firsthexadr);
                    }
                }
                break;

            case NodeContent.NodeType.RGN_ExtLinesBlock:
                firsthexadr = rgn.ExtLinesBlock.Offset;
                if (idx < 0)
                {
                    info.AppendLine("ExtLines");
                    info.AppendLine("  Block:  " + rgn.ExtLinesBlock.ToString());
                    hexlen = (int)rgn.ExtLinesBlock.Length;
                }
                else
                {
                    int subdividx = -1;
                    int count     = 0;
                    idx &= RGN_IDX_MASK; // Gesamt-Index des ExtArea
                    for (subdividx = 0; subdividx < rgn.SubdivList.Count; subdividx++)
                    {
                        count += rgn.SubdivList[subdividx].ExtLineList.Count;
                        if (idx < count)
                        {
                            break;
                        }
                    }
                    if (subdividx < rgn.SubdivList.Count)
                    {
                        asi = new AllSubdivInfo(rgn, filedata.BinaryReader, subdividx);
                        int idx2 = asi.SubdivData.ExtLineList.Count - (count - idx);
                        info.AppendLine("ExtLine " + idx2.ToString() + " from Subdiv " + subdividx.ToString());
                        ShowExtLineInfo(info, asi, rgn, tvd, filedata, idx2, 40, out hexlen, out firsthexadr);
                    }
                }
                break;

            case NodeContent.NodeType.RGN_ExtPointsBlock:
                firsthexadr = rgn.ExtPointsBlock.Offset;
                if (idx < 0)
                {
                    info.AppendLine("ExtPoints");
                    info.AppendLine("  Block:  " + rgn.ExtPointsBlock.ToString());
                    hexlen = (int)rgn.ExtPointsBlock.Length;
                }
                else
                {
                    int subdividx = -1;
                    int count     = 0;
                    idx &= RGN_IDX_MASK; // Gesamt-Index des ExtArea
                    for (subdividx = 0; subdividx < rgn.SubdivList.Count; subdividx++)
                    {
                        count += rgn.SubdivList[subdividx].ExtPointList.Count;
                        if (idx < count)
                        {
                            break;
                        }
                    }
                    if (subdividx < rgn.SubdivList.Count)
                    {
                        asi = new AllSubdivInfo(rgn, filedata.BinaryReader, subdividx);
                        int idx2 = asi.SubdivData.ExtPointList.Count - (count - idx);
                        info.AppendLine("ExtPoint " + idx2.ToString() + " from Subdiv " + subdividx.ToString());
                        ShowExtPointInfo(info, asi, rgn, tvd, filedata, idx2, 40, out hexlen, out firsthexadr);
                    }
                }
                break;

            case NodeContent.NodeType.RGN_UnknownBlock_0x71:
                firsthexadr = rgn.UnknownBlock_0x71.Offset;
                if (idx < 0)
                {
                    info.AppendLine("UnknownBlock 0x71");
                    info.AppendLine("  Block:  " + rgn.UnknownBlock_0x71.ToString());
                    hexlen = (int)rgn.UnknownBlock_0x71.Length;
                }
                break;

            case NodeContent.NodeType.Index:
                if (tvd.TreeView.SelectedNode != null)
                {
                    int subdividx = -1;

                    // etwas tricky ...
                    NodeContent nc = NodeContent4TreeNode(tvd.TreeView.SelectedNode.Parent);
                    switch (nc.Type)
                    {
                    case NodeContent.NodeType.Index:  // wenn der übergeordnete Knoten ein Index ist, dann ist es ein Subdiv-Index
                        subdividx = (int)nc.Data;
                        if (subdividx >= 0)
                        {
                            asi = new AllSubdivInfo(rgn, filedata.BinaryReader, subdividx);
                        }
                        break;
                    }
                }

                if (asi != null)
                {
                    if ((idx & RGN_IDX_POINT1) != 0)
                    {
                        idx &= RGN_IDX_MASK;
                        int tab = 40;

                        GarminCore.Files.StdFile_RGN.RawPointData point = asi.GetPoint(idx);
                        GarminCore.Files.StdFile_LBL lbl = tvd.GetLBL(filedata.Basename);

                        info.AppendLine(FillWithSpace("Type             (1 Byte)", tab, false, DecimalAndHexAndBinary(point.Type)));
                        info.AppendLine(FillWithSpace("LabelOffsetInLBL (3 Byte) (Bit 0..21)", tab, false, DecimalAndHexAndBinary(point.LabelOffsetInLBL)));
                        if (lbl != null)
                        {
                            info.AppendLine(FillWithSpace("   Text (from LBL)", tab, true, point.GetText(lbl, true)));
                        }
                        info.AppendLine(FillWithSpace("HasSubtype                (Bit 23)", tab, false, point.HasSubtype.ToString()));
                        info.AppendLine(FillWithSpace("IsPoiOffset               (Bit 22)", tab, false, point.IsPoiOffset.ToString()));
                        info.AppendLine(FillWithSpace("DeltaLongitude   (2 Byte)", tab, false, DecimalAndHexAndBinary((short)point.RawDeltaLongitude.Value) + ", " + point.RawDeltaLongitude.ValueDegree.ToString() + "°"));
                        info.AppendLine(FillWithSpace("DeltaLatitude    (2 Byte)", tab, false, DecimalAndHexAndBinary((short)point.RawDeltaLatitude.Value) + ", " + point.RawDeltaLatitude.ValueDegree.ToString() + "°"));
                        if (point.HasSubtype)
                        {
                            info.AppendLine(FillWithSpace("Subtype        (1 Byte)", tab, false, DecimalAndHexAndBinary(point.Subtype)));
                        }

                        GarminCore.DataBlock block = asi.GetDataBlock4Object(GarminCore.Files.StdFile_TRE.SubdivInfoBasic.SubdivContent.poi, idx);
                        firsthexadr  = rgn.SubdivContentBlock.Offset;
                        firsthexadr += block.Offset;
                        hexlen       = (int)block.Length;
                    }
                    else if ((idx & RGN_IDX_POINT2) != 0)
                    {
                        idx &= RGN_IDX_MASK;
                        int tab = 40;

                        GarminCore.Files.StdFile_RGN.RawPointData point = asi.GetIdxPoint(idx);
                        GarminCore.Files.StdFile_LBL lbl = tvd.GetLBL(filedata.Basename);

                        info.AppendLine(FillWithSpace("Type             (1 Byte)", tab, false, DecimalAndHexAndBinary(point.Type)));
                        info.AppendLine(FillWithSpace("LabelOffsetInLBL (3 Byte) (Bit 0..21)", tab, false, DecimalAndHexAndBinary(point.LabelOffsetInLBL)));
                        if (lbl != null)
                        {
                            info.AppendLine(FillWithSpace("   Text (from LBL)", tab, true, point.GetText(lbl, true)));
                        }
                        info.AppendLine(FillWithSpace("HasSubtype                (Bit 23)", tab, false, point.HasSubtype.ToString()));
                        info.AppendLine(FillWithSpace("IsPoiOffset               (Bit 22)", tab, false, point.IsPoiOffset.ToString()));
                        info.AppendLine(FillWithSpace("DeltaLongitude   (2 Byte)", tab, false, DecimalAndHexAndBinary((short)point.RawDeltaLongitude.Value) + ", " + point.RawDeltaLongitude.ValueDegree.ToString() + "°"));
                        info.AppendLine(FillWithSpace("DeltaLatitude    (2 Byte)", tab, false, DecimalAndHexAndBinary((short)point.RawDeltaLatitude.Value) + ", " + point.RawDeltaLatitude.ValueDegree.ToString() + "°"));
                        if (point.HasSubtype)
                        {
                            info.AppendLine(FillWithSpace("Subtype          (1 Byte)", tab, false, DecimalAndHexAndBinary(point.Subtype)));
                        }

                        GarminCore.DataBlock block = asi.GetDataBlock4Object(GarminCore.Files.StdFile_TRE.SubdivInfoBasic.SubdivContent.idxpoi, idx);
                        firsthexadr  = rgn.SubdivContentBlock.Offset;
                        firsthexadr += block.Offset;
                        hexlen       = (int)block.Length;
                    }
                    else if ((idx & RGN_IDX_LINE) != 0)
                    {
                        idx &= RGN_IDX_MASK;
                        int tab = 40;

                        GarminCore.Files.StdFile_RGN.RawPolyData poly = asi.GetLine(idx);
                        GarminCore.Files.StdFile_LBL             lbl  = tvd.GetLBL(filedata.Basename);
                        GarminCore.Files.StdFile_NET             net  = tvd.GetNET(filedata.Basename);

                        info.AppendLine(FillWithSpace("Type             (1 Byte) (Bit 0..5)", tab, false, DecimalAndHexAndBinary(poly.Type)));
                        info.AppendLine(FillWithSpace("TwoByteLength             (Bit 7)", tab, false, poly.TwoByteLength.ToString()));
                        if (!poly.IsPolygon)
                        {
                            info.AppendLine(FillWithSpace("Direction                 (Bit 6)", tab, false, poly.DirectionIndicator.ToString()));
                        }
                        info.AppendLine(FillWithSpace("LabelOffsetInLBL (3 Byte) (Bit 0..21)", tab, false, DecimalAndHexAndBinary(poly.LabelOffsetInLBL)));

                        if (!poly.LabelInNET)
                        {
                            if (lbl != null)
                            {
                                info.AppendLine(FillWithSpace("Text (from LBL)", tab, true, poly.GetText(lbl, true)));
                            }
                        }
                        else
                        {
                            if (net != null)
                            {
                                GarminCore.Files.StdFile_NET.RoadData rd = net.GetRoadData(poly.LabelOffsetInLBL);
                                if (rd != null)
                                {
                                    info.AppendLine(FillWithSpace("Text (from NET, LBL)", tab, true, rd.GetText(lbl, true)));
                                }
                            }
                        }

                        info.AppendLine(FillWithSpace("WithExtraBit              (Bit 22)", tab, false, poly.WithExtraBit.ToString()));
                        info.AppendLine(FillWithSpace("LabelInNET                (Bit 23)", tab, false, poly.LabelInNET.ToString()));
                        info.AppendLine(FillWithSpace("DeltaLongitude   (2 Byte)", tab, false, DecimalAndHexAndBinary((short)poly.RawDeltaLongitude.Value) + ", " + poly.RawDeltaLongitude.ValueDegree.ToString() + "°"));
                        info.AppendLine(FillWithSpace("DeltaLatitude    (2 Byte)", tab, false, DecimalAndHexAndBinary((short)poly.RawDeltaLatitude.Value) + ", " + poly.RawDeltaLatitude.ValueDegree.ToString() + "°"));
                        info.AppendLine(FillWithSpace("BitstreamInfo    (1 Byte)", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo)));
                        info.AppendLine(FillWithSpace("   basebits4lat", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo >> 4)));
                        info.AppendLine(FillWithSpace("   basebits4lon", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo & 0xF)));
                        info.AppendLine(FillWithSpace("BitstreamLength (" + (poly.TwoByteLength ? "2" : "1") + " Byte)", tab, false, DecimalAndHexAndBinary(poly.bitstream.Length)));
                        if (poly.WithExtraBit)
                        {
                            info.AppendLine(FillWithSpace("ExtraBitList", tab, false, AllSubdivInfo.ExtraBits(poly)));
                        }
                        info.AppendLine("Deltas:");
                        List <GarminCore.Files.StdFile_RGN.GeoDataBitstream.RawPoint> points = poly.GetRawPoints();
                        for (int i = 0; i < points.Count; i++)
                        {
                            info.AppendLine("   " + points[i].ToString() + " / " + points[0].GetMapUnitPoint(rgn.TREFile.MaplevelList[asi.MaplevelNo].CoordBits, asi.SubdivfInfo.Center).ToString());
                        }

                        GarminCore.DataBlock block = asi.GetDataBlock4Object(GarminCore.Files.StdFile_TRE.SubdivInfoBasic.SubdivContent.line, idx);
                        firsthexadr  = rgn.SubdivContentBlock.Offset;
                        firsthexadr += block.Offset;
                        hexlen       = (int)block.Length;
                    }
                    else if ((idx & RGN_IDX_AREA) != 0)
                    {
                        idx &= RGN_IDX_MASK;
                        int tab = 40;

                        GarminCore.Files.StdFile_RGN.RawPolyData poly = asi.GetArea(idx);
                        GarminCore.Files.StdFile_LBL             lbl  = tvd.GetLBL(filedata.Basename);
                        GarminCore.Files.StdFile_NET             net  = tvd.GetNET(filedata.Basename);

                        info.AppendLine(FillWithSpace("Type             (1 Byte) (Bit 0..6) ", tab, false, DecimalAndHexAndBinary(poly.Type)));
                        info.AppendLine(FillWithSpace("TwoByteLength             (Bit 7)", tab, false, poly.TwoByteLength.ToString()));
                        info.AppendLine(FillWithSpace("LabelOffsetInLBL (3 Byte) (Bit 0..21)", tab, false, DecimalAndHexAndBinary(poly.LabelOffsetInLBL)));

                        if (!poly.LabelInNET)
                        {
                            if (lbl != null)
                            {
                                info.AppendLine(FillWithSpace("Text (from LBL)", tab, true, poly.GetText(lbl, true)));
                            }
                        }
                        else
                        {
                            if (net != null)
                            {
                                GarminCore.Files.StdFile_NET.RoadData rd = net.GetRoadData(poly.LabelOffsetInLBL);
                                if (rd != null)
                                {
                                    info.AppendLine(FillWithSpace("Text (from NET, LBL)", tab, true, rd.GetText(lbl, true)));
                                }
                            }
                        }

                        info.AppendLine(FillWithSpace("WithExtraBit              (Bit 22)", tab, false, poly.WithExtraBit.ToString()));
                        info.AppendLine(FillWithSpace("LabelInNET                (Bit 23)", tab, false, poly.LabelInNET.ToString()));
                        info.AppendLine(FillWithSpace("DeltaLongitude   (2 Byte)", tab, false, DecimalAndHexAndBinary((short)poly.RawDeltaLongitude.Value) + ", " + poly.RawDeltaLongitude.ValueDegree.ToString() + "°"));
                        info.AppendLine(FillWithSpace("DeltaLatitude    (2 Byte)", tab, false, DecimalAndHexAndBinary((short)poly.RawDeltaLatitude.Value) + ", " + poly.RawDeltaLatitude.ValueDegree.ToString() + "°"));
                        info.AppendLine(FillWithSpace("BitstreamInfo    (1 Byte)", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo)));
                        info.AppendLine(FillWithSpace("   basebits4lat", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo >> 4)));
                        info.AppendLine(FillWithSpace("   basebits4lon", tab, false, DecimalAndHexAndBinary(poly.bitstreamInfo & 0xF)));
                        info.AppendLine(FillWithSpace("BitstreamLength (" + (poly.TwoByteLength ? "2" : "1") + " Byte)", tab, false, DecimalAndHexAndBinary(poly.bitstream.Length)));
                        if (poly.WithExtraBit)
                        {
                            info.AppendLine(FillWithSpace("ExtraBitList", tab, false, AllSubdivInfo.ExtraBits(poly)));
                        }
                        info.AppendLine("Deltas:");
                        List <GarminCore.Files.StdFile_RGN.GeoDataBitstream.RawPoint> points = poly.GetRawPoints();
                        for (int i = 0; i < points.Count; i++)
                        {
                            info.AppendLine("   " + points[i].ToString() + " / " + points[0].GetMapUnitPoint(rgn.TREFile.MaplevelList[asi.MaplevelNo].CoordBits, asi.SubdivfInfo.Center).ToString());
                        }

                        GarminCore.DataBlock block = asi.GetDataBlock4Object(GarminCore.Files.StdFile_TRE.SubdivInfoBasic.SubdivContent.area, idx);
                        firsthexadr  = rgn.SubdivContentBlock.Offset;
                        firsthexadr += block.Offset;
                        hexlen       = (int)block.Length;
                    }
                    else if ((idx & RGN_IDX_EXTPOINT) != 0)
                    {
                        ShowExtPointInfo(info, asi, rgn, tvd, filedata, idx & RGN_IDX_MASK, 40, out hexlen, out firsthexadr);
                    }
                    else if ((idx & RGN_IDX_EXTLINE) != 0)
                    {
                        ShowExtLineInfo(info, asi, rgn, tvd, filedata, idx & RGN_IDX_MASK, 40, out hexlen, out firsthexadr);
                    }
                    else if ((idx & RGN_IDX_EXTAREA) != 0)
                    {
                        ShowExtAreaInfo(info, asi, rgn, tvd, filedata, idx & RGN_IDX_MASK, 40, out hexlen, out firsthexadr);
                    }
                }


                break;

            default:
                info.AppendLine("internal error: no info for nodetype '" + nodetype.ToString() + "'");
                break;
            }

            if (hexlen > 0)
            {
                hex = HexRange(firsthexadr, filedata.BinaryReader, hexlen);
            }
        }
コード例 #5
0
ファイル: DataNET.cs プロジェクト: FSofTlpz/GMExplorer
        /// <summary>
        /// Funktion für alle NET-Datei-Infos
        /// </summary>
        /// <param name="info"></param>
        /// <param name="hex"></param>
        /// <param name="firsthexadr"></param>
        /// <param name="filedata"></param>
        /// <param name="nodetype"></param>
        /// <param name="idx"></param>
        /// <param name="tvd"></param>
        public static void SectionAndIndex(StringBuilder info, out byte[] hex, out long firsthexadr, NodeContent.Content4File filedata, NodeContent.NodeType nodetype, int idx, TreeViewData tvd)
        {
            GarminCore.Files.StdFile_NET net = filedata.GetGarminFileAsNET(tvd.GetLBL(filedata.Basename));
            int hexlen = 0;

            firsthexadr = 0;
            hex         = null;
            int tab = 20;

            switch (nodetype)
            {
            case NodeContent.NodeType.RGN_PostHeaderData:
                firsthexadr = net.PostHeaderDataBlock.Offset;
                if (idx < 0)
                {
                    info.AppendLine("PostHeaderDataBlock: " + net.PostHeaderDataBlock.ToString());
                    hexlen = (int)net.PostHeaderDataBlock.Length;
                }
                break;

            case NodeContent.NodeType.NET_RoadDefinitionsBlock:
                firsthexadr = net.RoadDefinitionsBlock.Offset;
                if (idx < 0)
                {
                    tab = 15;
                    info.AppendLine("RoadDefinitionsBlock");
                    info.AppendLine(FillWithSpace("  Block", tab, false, net.RoadDefinitionsBlock.ToString()));
                    info.AppendLine(FillWithSpace("  Roads", tab, false, net.Roaddata.Count.ToString()));
                    hexlen = (int)net.RoadDefinitionsBlock.Length;
                }
                else    // einzelnes Element
                {
                    if ((idx & NET_IDX_ROAD) != 0)
                    {
                        idx &= NET_IDX_MASK;
                        tab  = 25;

                        GarminCore.Files.StdFile_NET.RoadData rd = net.Roaddata[idx];

                        //info.AppendLine(rd.ToString());
                        string labels = rd.LabelInfo.Count.ToString();
                        if (rd.LabelInfo.Count > 0)
                        {
                            labels += " -> ";
                            for (int i = 0; i < rd.LabelInfo.Count; i++)
                            {
                                if (i > 0)
                                {
                                    labels += ", ";
                                }
                                labels += DecimalAndHexAndBinary(rd.LabelInfo[i]);
                            }
                        }
                        info.AppendLine(FillWithSpace("Labels", tab, false, labels));
                        for (int i = 0; i < rd.LabelInfo.Count; i++)
                        {
                            info.AppendLine(FillWithSpace("   Label (LBL)" + i.ToString(), tab, true, rd.GetText(net.Lbl, i, false)));
                        }

                        info.AppendLine(FillWithSpace("Roaddatainfos", tab, false, rd.Roaddatainfos.ToString()));
                        info.AppendLine(FillWithSpace("RoadLength", tab, false, rd.RoadLength.ToString() + "m"));

                        info.AppendLine(FillWithSpace("RgnIndexOverviews", tab, false, rd.RgnIndexOverview.Count.ToString()));
                        for (int i = 0, j = 0; i < rd.RgnIndexOverview.Count; i++)
                        {
                            info.Append(FillWithSpace("   RgnIndexOverview " + i.ToString(), tab, false, rd.RgnIndexOverview[i].ToString()));
                            if (rd.RgnIndexOverview[i] > 0)
                            {
                                info.Append(" -> ");
                                for (int k = 0; k < rd.RgnIndexOverview[i]; k++)
                                {
                                    info.Append(" " + rd.Indexdata[j++].ToString());
                                }
                            }
                            info.AppendLine();
                        }
                        info.AppendLine(FillWithSpace("SegmentedRoadOffsets", tab, false, rd.SegmentedRoadOffsets.Count.ToString()));
                        for (int i = 0; i < rd.SegmentedRoadOffsets.Count; i++)
                        {
                            info.AppendLine(FillWithSpace("   SegmentedRoadOffsets " + i.ToString(), tab, false, DecimalAndHexAndBinary(rd.SegmentedRoadOffsets[i])));
                        }

                        if (rd.HasRoadDataInfo(GarminCore.Files.StdFile_NET.RoadData.RoadDataInfo.has_street_address_info))
                        {
                            // Bit 0..9 'NodeCount', Bits 10,11 für Zip; Bits 12,13 für City; Bits 14,15 für Nummbers
                            info.AppendLine(FillWithSpace("NodeCountAndFlags", tab, false, DecimalAndHexAndBinary(rd.NodeCountAndFlags, 16)));
                            info.AppendLine(FillWithSpace("   NodeCount", tab, false, rd.NodeCount.ToString()));
                            info.AppendLine(FillWithSpace("   ZipFlag", tab, false, DecimalAndHexAndBinary(rd.ZipFlag)));
                            for (int side = 0; side < rd.ZipIndex4Node.Count; side++)
                            {
                                if (rd.ZipIndex4Node[side].Count > 0)
                                {
                                    info.AppendLine(FillWithSpace(side == 0 ?
                                                                  "      Left (LBL)" :
                                                                  "      Right (LBL)", tab, true,
                                                                  rd.GetZipText(net.Lbl,
                                                                                side == 0 ?
                                                                                GarminCore.Files.StdFile_NET.RoadData.Side.Left :
                                                                                GarminCore.Files.StdFile_NET.RoadData.Side.Right,
                                                                                false)));
                                }
                            }
                            info.AppendLine(FillWithSpace("   CityFlag", tab, false, DecimalAndHexAndBinary(rd.CityFlag)));
                            for (int side = 0; side < rd.CityIndex4Node.Count; side++)
                            {
                                if (rd.CityIndex4Node[side].Count > 0)
                                {
                                    info.AppendLine(FillWithSpace(side == 0 ?
                                                                  "      Left (LBL)" :
                                                                  "      Right (LBL)", tab, true,
                                                                  rd.GetCityText(net.Lbl,
                                                                                 tvd.GetRGN(filedata.Basename),
                                                                                 side == 0 ?
                                                                                 GarminCore.Files.StdFile_NET.RoadData.Side.Left :
                                                                                 GarminCore.Files.StdFile_NET.RoadData.Side.Right,
                                                                                 false)));
                                }
                            }

                            string bin = "";
                            for (int i = 0; i < rd.NumberStream.Length; i++)
                            {
                                bin += Binary(rd.NumberStream[i]);
                            }

                            bin = Binary(rd.NumberStream);
                            info.AppendLine(FillWithSpace("   NumberFlag, -stream", tab, false, DecimalAndHexAndBinary(rd.NumberFlag) + "   " + HexString(rd.NumberStream) + "   " + bin));
                            if (rd.NumberStream.Length > 0)
                            {
                                GarminCore.Files.StdFile_NET.RoadData.Housenumbers numbers = new GarminCore.Files.StdFile_NET.RoadData.Housenumbers(rd.NumberStream);
                                for (int n = 0; n < numbers.Numbers.Count; n++)
                                {
                                    info.AppendLine(new string(' ', tab + 3) + numbers.Numbers[n].ToString() + " (raw: " + numbers.Numbers[n].rawdata.ToString() + ")");
                                }
                            }
                        }



                        if (rd.HasRoadDataInfo(GarminCore.Files.StdFile_NET.RoadData.RoadDataInfo.has_nod_info))
                        {
                            info.AppendLine(FillWithSpace("NODFlag", tab, false, rd.NODFlag.ToString()));
                            info.AppendLine(FillWithSpace("NOD_Offset", tab, false, DecimalAndHexAndBinary(rd.NOD_Offset)));
                        }

                        // für die Hex-Anzeige
                        firsthexadr = net.RoadDefinitionsBlock.Offset;
                        for (int i = 0; i < idx; i++)
                        {
                            firsthexadr += net.Roaddata[i].RawBytes;
                        }
                        hexlen = (int)net.Roaddata[idx].RawBytes;
                    }
                }
                break;

            case NodeContent.NodeType.NET_SegmentedRoadsBlock:
                firsthexadr = net.RoadDefinitionsBlock.Offset;
                if (idx < 0)
                {
                    tab = 15;
                    info.AppendLine("SegmentedRoadsBlock");
                    info.AppendLine(FillWithSpace("  Block", tab, false, net.SegmentedRoadsBlock.ToString()));
                    hexlen = (int)net.SegmentedRoadsBlock.Length;
                }
                else    // einzelnes Element



                {
                }
                break;

            case NodeContent.NodeType.NET_SortedRoadsBlock:
                firsthexadr = net.RoadDefinitionsBlock.Offset;
                if (idx < 0)
                {
                    tab = 15;
                    info.AppendLine("SortedRoadsBlock");
                    info.AppendLine(FillWithSpace("  Block", tab, false, net.SortedRoadsBlock.ToString()));
                    info.AppendLine(FillWithSpace("  Offsets", tab, false, net.SortedOffsets.Count.ToString()));
                    hexlen = (int)net.SortedRoadsBlock.Length;

                    List <uint> t1 = new List <uint>(net.SortedOffsets);
                    t1.Sort();
                }
                else    // einzelnes Element
                {
                    tab = 20;
                    if ((idx & NET_IDX_SORTEDOFFSET) != 0)
                    {
                        idx &= NET_IDX_MASK;
                        info.AppendLine(FillWithSpace("Offset", tab, false, DecimalAndHexAndBinary(net.SortedOffsets[idx])));
                        int offs = (int)net.SortedOffsets[idx];
                        for (int i = 0; i < net.Roaddata.Count; i++)
                        {
                            offs -= net.Roaddata[i].RawBytes;
                            if (offs == 0)
                            {
                                info.AppendLine(FillWithSpace("Roaddata-Index", tab, false, i.ToString()));
                                break;
                            }
                            else if (offs < 0)
                            {
                                info.AppendLine("Roaddata-Index not found -> error ?");
                                break;
                            }
                        }
                    }
                }
                break;



            default:
                info.AppendLine("internal error: no info for nodetype '" + nodetype.ToString() + "'");
                break;
            }

            if (hexlen > 0)
            {
                hex = HexRange(firsthexadr, filedata.BinaryReader, hexlen);
            }
        }