C# 进程内存读取所得Hex字节数组快速转字符串方案咨询
问题根源
你原有拼接逻辑性能差的核心原因是string是不可变类型,每次执行+=操作都会在堆上生成新的字符串对象,大数组场景下会产生大量内存分配和GC开销,速度自然很慢。
你尝试的强转char方案不生效,是因为该逻辑是把字节值直接作为Unicode编码映射为字符,而非转换为十六进制字符表示,比如字节0xF2会直接转成对应的特殊字符,而非字符串"F2",自然不符合要求。
可用解决方案
方案1:.NET 5+ 原生方法(性能最优)
.NET 5及以上版本框架内置了优化过的字节转十六进制字符串方法,直接调用即可,性能远高于手写实现:
string buffer = Convert.ToHexString(moduleBytes);
该方法输出的大写十六进制格式和你原有逻辑预期完全一致,且自动补全前导0。
方案2:预分配容量的StringBuilder(兼容所有.NET版本)
如果使用.NET Framework等低版本框架不支持上述方法,可以用StringBuilder预先分配好所需的容量(每个字节对应2个十六进制字符,总容量为字节数组长度*2),避免反复扩容开销:
StringBuilder sb = new StringBuilder(moduleBytes.Length * 2); foreach (byte b in moduleBytes) { // 注意用X2格式符,保证不足两位的字节补前导0,比如0x01输出为"01"而非"1" sb.Append(b.ToString("X2")); } string buffer = sb.ToString();
方案3:查找表优化(超大数据场景极致性能)
如果需要处理MB级以上的超大字节数组,可以预先全局初始化十六进制查找表,省去每次调用ToString的开销:
// 全局只初始化一次查找表 private static readonly string[] HexLookup = Enumerable.Range(0, 256).Select(b => b.ToString("X2")).ToArray(); // 转换逻辑 StringBuilder sb = new StringBuilder(moduleBytes.Length * 2); foreach (byte b in moduleBytes) { sb.Append(HexLookup[b]); } string buffer = sb.ToString();
额外优化建议
你现有逻辑需要先转字符串再做KMP匹配,其实可以直接对原始字节数组做KMP模式匹配,完全跳过字符串转换的步骤,进一步节省内存和转换时间,性能会有更大提升。
注意事项
你原有代码中的ToString("X")存在隐藏bug:当字节值小于16时,只会输出1位字符,比如0x05会输出为"5"而非"05",会导致十六进制串长度错位,KMP匹配结果完全错误,所有转换逻辑都必须使用X2格式符强制输出两位十六进制字符。
内容的提问来源于stack exchange,提问作者Baseult Private
相关产品推荐
相关产品推荐

