从.NET Framework4.5迁移至.NET6后ReadUInt32LE函数异常求助
快速修复方案:.NET 6下ReadUInt32LE异常问题
核心原因排查
.NET Framework与.NET 6中Stream.Read的行为存在差异:.NET Framework中当Stream剩余字节不足时,可能会用0填充未读取的数组位置;而.NET 6仅返回实际读取的字节数,未读取的数组位置保留初始值。如果你的自定义ReadUInt32LE方法未处理读取字节数不足4字节的情况,就会导致后续读取返回异常值。
修复Stream扩展方法
替换StreamExtensions.cs中的ReadUInt32LE和ReadInt32LE方法,确保严格读取完整4字节并正确处理小端转换:
public static uint ReadUInt32LE(this Stream stream) { var buffer = new byte[4]; int bytesRead = stream.Read(buffer, 0, 4); if (bytesRead != 4) throw new EndOfStreamException("无法读取完整的UInt32数据"); if (BitConverter.IsLittleEndian) return BitConverter.ToUInt32(buffer, 0); else { Array.Reverse(buffer); return BitConverter.ToUInt32(buffer, 0); } } public static int ReadInt32LE(this Stream stream) { var buffer = new byte[4]; int bytesRead = stream.Read(buffer, 0, 4); if (bytesRead != 4) throw new EndOfStreamException("无法读取完整的Int32数据"); if (BitConverter.IsLittleEndian) return BitConverter.ToInt32(buffer, 0); else { Array.Reverse(buffer); return BitConverter.ToInt32(buffer, 0); } }
验证readNewFileTable调用逻辑
检查ArkPackage.cs的readNewFileTable方法:
- 调用
ReadUInt32LE前打印stream.Position确认读取位置是否符合预期 - 确保没有意外修改Stream指针位置,导致重复读取或跳过数据
临时应急修复(快速验证用)
如果暂时不想修改扩展方法,可直接用BinaryReader替代自定义方法:
// 使用BinaryReader读取小端UInt32,.NET 6中行为稳定 using var reader = new BinaryReader(stream, Encoding.Default, leaveOpen: true); reader.BaseStream.Position = stream.Position; uint fileCount = reader.ReadUInt32(); // 若运行环境为大端系统,需手动反转字节数组后再转换
内容的提问来源于stack exchange,提问作者VocalFan
相关产品推荐
相关产品推荐

