72 lines
2.3 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|