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

C# 高效字节数组转十六进制字符串如何添加空格分隔符

高性能Byte数组转带空格分隔十六进制字符串实现方案

修改核心逻辑

  • 无需改动原有lookup查找表的预生成逻辑,仅调整输出字符数组的长度和赋值规则即可
  • 原无分隔版本的字符数组长度为bytes.Length * 2,新增空格分隔后总长度调整为bytes.Length * 3 - 1(N个字节对应N-1个分隔空格)
  • 循环赋值时调整字符下标偏移量,每处理完一个非末尾字节后直接插入空格,无额外二次遍历开销

修改后完整代码

private static readonly uint[] _lookup32 = CreateLookup32();

private static uint[] CreateLookup32()
{
    var result = new uint[256];
    for (int i = 0; i < 256; i++)
    {
        string s = i.ToString("X2");
        result[i] = ((uint)s[0]) + ((uint)s[1] << 16);
    }
    return result;
}

private static string ByteArrayToHexViaLookup32WithSpace(byte[] bytes)
{
    // 空输入直接返回空,避免数组长度为负报错
    if (bytes == null || bytes.Length == 0)
        return string.Empty;
        
    var lookup32 = _lookup32;
    // 总长度 = 2*字节数 + (字节数-1)个空格
    var result = new char[bytes.Length * 3 - 1];
    for (int i = 0; i < bytes.Length; i++)
    {
        var val = lookup32[bytes[i]];
        // 偏移量调整为3*i,跳过空格位置
        result[3 * i] = (char)val;
        result[3 * i + 1] = (char)(val >> 16);
        // 非末尾字节追加空格
        if (i != bytes.Length - 1)
        {
            result[3 * i + 2] = ' ';
        }
    }
    return new string(result);
}

补充说明

  • 该实现仅做一次内存分配、一次遍历,无额外字符串拼接/截取操作,性能和原无分隔版本几乎持平,远高于生成无分隔字符串后再插入空格的方案
  • 若需要小写十六进制输出,仅需将CreateLookup32方法中的i.ToString("X2")修改为i.ToString("x2")即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:36:05