Files

72 lines
2.3 KiB
C#

using System;
using System.Text;
namespace XP.Hardware.PLC.Helpers
{
/// <summary>
/// 十六进制数据格式化工具 | Hex data formatter utility
/// 将 byte[] 格式化为标准十六进制查看器格式
/// </summary>
public static class HexFormatter
{
/// <summary>
/// 将 byte[] 格式化为十六进制查看器文本 | Format byte[] as hex viewer text
/// 每行 16 字节,包含偏移量、十六进制值和 ASCII 表示
/// </summary>
/// <param name="data">字节数据 | Byte data</param>
/// <param name="startOffset">起始偏移量 | Start offset</param>
/// <returns>格式化后的字符串 | Formatted string</returns>
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();
}
}
}