using System; using System.Text; namespace XP.Hardware.PLC.Helpers { /// /// 十六进制数据格式化工具 | Hex data formatter utility /// 将 byte[] 格式化为标准十六进制查看器格式 /// public static class HexFormatter { /// /// 将 byte[] 格式化为十六进制查看器文本 | Format byte[] as hex viewer text /// 每行 16 字节,包含偏移量、十六进制值和 ASCII 表示 /// /// 字节数据 | Byte data /// 起始偏移量 | Start offset /// 格式化后的字符串 | Formatted string public static string Format(byte[] data, int startOffset = 0) { if (data == null || data.Length == 0) return string.Empty; var sb = new StringBuilder(); int totalBytes = data.Length; for (int i = 0; i < totalBytes; i += 16) { // 偏移量(8位十六进制)| Offset (8-digit hex) sb.Append($"{(startOffset + i):X8} "); // 前 8 字节十六进制 | First 8 bytes hex for (int j = 0; j < 8; j++) { if (i + j < totalBytes) sb.Append($"{data[i + j]:X2} "); else sb.Append(" "); } sb.Append(' '); // 后 8 字节十六进制 | Last 8 bytes hex for (int j = 8; j < 16; j++) { if (i + j < totalBytes) sb.Append($"{data[i + j]:X2} "); else sb.Append(" "); } sb.Append(' '); // ASCII 表示 | ASCII representation for (int j = 0; j < 16; j++) { if (i + j < totalBytes) { byte b = data[i + j]; sb.Append(b >= 0x20 && b <= 0x7E ? (char)b : '.'); } } if (i + 16 < totalBytes) sb.AppendLine(); } return sb.ToString(); } } }