You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 将byte[]转换为字面量字符串 实现流量日志特殊字符原样记录

C# 网关流量日志保留转义字面量解决方案

你遇到的问题本质是直接将原始字节转成字符串时,ASCII 控制字符(值小于0x20的字节)会被解析为不可见控制符,而非你需要的\xHH格式字面量。直接使用Encoding.GetString、Convert.ToString等方法都是按照字符编码规则解析字节为对应字符,自然无法达到预期效果,可通过如下方案实现:

核心实现方法

将读取到的原始TCP/UDP字节数组直接做逐字节转换,可打印字符保留原字符,不可打印字符转义为\x加两位十六进制的字面量格式:

using System.Text;

public static class TrafficLogConverter
{
    /// <summary>
    /// 将原始流量字节数组转成可保留转义字面量的日志字符串
    /// </summary>
    public static string ToLogLiteral(byte[] trafficBytes)
    {
        StringBuilder logBuilder = new StringBuilder(trafficBytes.Length * 4);
        foreach (byte b in trafficBytes)
        {
            // 处理反斜杠转义,避免歧义
            if (b == 0x5C)
            {
                logBuilder.Append("\\\\");
            }
            // 可打印ASCII字符范围:0x20(空格) ~ 0x7E(~)直接输出
            else if (b >= 0x20 && b <= 0x7E)
            {
                logBuilder.Append((char)b);
            }
            // 不可打印字符转成\x加两位十六进制格式
            else
            {
                logBuilder.Append($"\\x{b:X2}");
            }
        }
        return logBuilder.ToString();
    }
}

调用示例

// 示例字节数组:对应ASYRE\x00\x00\x01
byte[] testBytes = new byte[] { 0x41, 0x53, 0x59, 0x52, 0x45, 0x00, 0x00, 0x01 };
string logContent = TrafficLogConverter.ToLogLiteral(testBytes);
// 输出结果:ASYRE\x00\x00\x01,直接写入日志文件即可
Console.WriteLine(logContent);

自定义调整说明

  • 若需要小写十六进制格式,将代码中的X2改为x2即可输出\x00类小写格式
  • 若不需要转义反斜杠,删除对应判断分支即可
  • 若需要用双引号包裹最终日志内容,调用时直接拼接$"\"{logContent}\""即可

内容的提问来源于stack exchange,提问作者Malathiane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:24:01