C# 代码优化:处理 GZipStream 读取数据长度异常
C# 代码优化:处理 GZipStream 读取数据长度异常
这段代码处理后的 eventString 长度异常为 50000,应该如何修改内容:在处理 gzipStream 读取的数据时,您需要使用 gzipStream.Read 的返回值来确定实际读取的字节数。您可以修改代码如下:
using (var gzipStream = new GZipStream(readStream, CompressionMode.Decompress))
{
int bytesRead = 0;
while ((bytesRead = gzipStream.Read(outputBytes, bytesRead, outputBytes.Length - bytesRead)) > 0)
{
// 继续读取剩余的字节
}
}
string eventString = Encoding.UTF8.GetString(outputBytes, 0, bytesRead);
这样修改后,eventString 的长度应该与实际数据的长度相匹配。
解释:
-
原代码中,直接使用
outputBytes.Length作为Encoding.UTF8.GetString的参数,导致读取了超出实际数据长度的字节,从而导致长度异常。 -
使用
gzipStream.Read的返回值bytesRead来确定实际读取的字节数,然后使用Encoding.UTF8.GetString(outputBytes, 0, bytesRead)仅读取实际读取的字节数,就可以避免数据长度异常。
总结:
在使用 GZipStream 读取数据时,务必使用 gzipStream.Read 的返回值来确定实际读取的字节数,避免数据长度异常。
代码示例:
private static void InitSeedInfo()
{
var seedInfo = 'H4sIAAAAAAAAA22OwQoCMQxE/6XnOXTSNO36K7IHRZDFPblH8d9NVqwIklDaYeZNH+l6Xy5bOhwbqGAGCwTsEEIEMoETVFF8KzRDO6ovUQtqg1W0DDNYR9MZ6Xxa1+DVHWi6u8PmEeeYN1j0SAmC0yKO4jKD0aPba6LbadtteeMI/49P8SE+Lxm378mhcujyN8Ffx/x8ATND6i0OAQAA';
if (string.IsNullOrEmpty(seedInfo))
{
return;
}
byte[] inputBytes = Convert.FromBase64String(seedInfo);
byte[] outputBytes = new byte[50000];
using (var readStream = new MemoryStream(inputBytes))
{
using (var gzipStream = new GZipStream(readStream, CompressionMode.Decompress))
{
int bytesRead = 0;
while ((bytesRead = gzipStream.Read(outputBytes, bytesRead, outputBytes.Length - bytesRead)) > 0)
{
// 继续读取剩余的字节
}
}
string eventString = Encoding.UTF8.GetString(outputBytes, 0, bytesRead);
// 处理一下 eventString
var temp1 = eventString.Replace('"grids"', '\"grids\"');
var temp2 = temp1.Replace('"balls"', '\"balls\"');
var temp3 = temp2.Replace('"skills"', '\"skills\"');
Debug.LogError(eventString);
Debug.LogError(eventString.Length);
Debug.LogError(temp3);
Debug.LogError(temp3.Length);
var gameStartData = JsonMapper.ToObject<GameStartData>(temp3);
Debug.LogError(gameStartData);
}
}
原文地址: https://www.cveoy.top/t/topic/qzyr 著作权归作者所有。请勿转载和采集!