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 的长度应该与实际数据的长度相匹配。

解释:

  1. 原代码中,直接使用 outputBytes.Length 作为 Encoding.UTF8.GetString 的参数,导致读取了超出实际数据长度的字节,从而导致长度异常。

  2. 使用 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);
    }
}
C# 代码优化:处理 GZipStream 读取数据长度异常

原文地址: https://www.cveoy.top/t/topic/qzyr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录