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); } } }