Beispiel #1
0
        private void UpdateHexView()
        {
            int cbData = (m_bDataExpanded ? m_pbData.Length :
                          Math.Min(m_pbData.Length, 16 * 256));

            const int cbGrp  = 4;
            const int cbLine = 16;

            int iMaxAddrWidth = Convert.ToString(Math.Max(cbData - 1, 0), 16).Length;

            int cbDataUp = cbData;

            if ((cbDataUp % cbLine) != 0)
            {
                cbDataUp = cbDataUp + cbLine - (cbDataUp % cbLine);
            }
            Debug.Assert(((cbDataUp % cbLine) == 0) && (cbDataUp >= cbData));

            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < cbDataUp; ++i)
            {
                if ((i % cbLine) == 0)
                {
                    sb.Append(Convert.ToString(i, 16).ToUpper().PadLeft(
                                  iMaxAddrWidth, '0'));
                    sb.Append(": ");
                }

                if (i < cbData)
                {
                    byte bt     = m_pbData[i];
                    byte btHigh = (byte)(bt >> 4);
                    byte btLow  = (byte)(bt & 0x0F);
                    if (btHigh >= 10)
                    {
                        sb.Append((char)('A' + btHigh - 10));
                    }
                    else
                    {
                        sb.Append((char)('0' + btHigh));
                    }
                    if (btLow >= 10)
                    {
                        sb.Append((char)('A' + btLow - 10));
                    }
                    else
                    {
                        sb.Append((char)('0' + btLow));
                    }
                }
                else
                {
                    sb.Append("  ");
                }

                if (((i + 1) % cbGrp) == 0)
                {
                    sb.Append(' ');
                }

                if (((i + 1) % cbLine) == 0)
                {
                    sb.Append(' ');
                    int iStart   = i - cbLine + 1;
                    int iEndExcl = Math.Min(iStart + cbLine, cbData);
                    for (int j = iStart; j < iEndExcl; ++j)
                    {
                        sb.Append(StrUtil.ByteToSafeChar(m_pbData[j]));
                    }
                    sb.AppendLine();
                }
            }

            if (cbData < m_pbData.Length)
            {
                sb.AppendLine(m_strDataExpand);
            }

            SetRtbData(sb.ToString(), false, true);

            if (cbData < m_pbData.Length)
            {
                int iLinkStart = m_rtbText.Text.LastIndexOf(m_strDataExpand);
                if (iLinkStart >= 0)
                {
                    m_rtbText.Select(iLinkStart, m_strDataExpand.Length);
                    UIUtil.RtfSetSelectionLink(m_rtbText);
                    m_rtbText.Select(0, 0);
                }
                else
                {
                    Debug.Assert(false);
                }
            }
        }