这段代码处理后的eventString长度异常为50000,应该如何修改?

private static void InitSeedInfo()
{
    var seedInfo = 'H4sIAAAAAAAAA22OwQoCMQxE/6XnOXTSNO36K7IHRZDFPblH8d9NVqwIklDaYeZNH+l6Xy5bOhwbqGAGCwTsEEIEMoETVFF8KzRDO6ovUQtqg1W0DDNYR9MZ6Xxa1+DVHWi6u8PmEeeYN1j0SAmC0yKO4jKD0aPba6LbadtteeMI/49P8SE+Lxm378mhcujyN8Ffx/x8ATND6i0OAQAA';
            
    if (string.IsNullOrEmpty(seedInfo))
    {
        return;
    }

    byte[] inputBytes = Convert.FromBase64String(seedInfo);
    using (var readStream = new MemoryStream(inputBytes))
    {
        using (var gzipStream = new GZipStream(readStream, CompressionMode.Decompress))
        {
            using (var outputMemoryStream = new MemoryStream())
            {
                gzipStream.CopyTo(outputMemoryStream);
                byte[] outputBytes = outputMemoryStream.ToArray();
                string eventString = Encoding.UTF8.GetString(outputBytes);

                //处理一下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);
            }
        }
    }
}

问题分析:

代码中使用 gzipStream.Read(outputBytes, 0, outputBytes.Length) 读取解压缩后的数据,但 outputBytes 的长度固定为 50000,导致实际数据长度可能超过数组大小,造成长度异常。

解决方案:

使用 MemoryStream 来保存解压缩后的数据,获取实际长度,避免数组溢出。

修改后的代码:

private static void InitSeedInfo()
{
    var seedInfo = 'H4sIAAAAAAAAA22OwQoCMQxE/6XnOXTSNO36K7IHRZDFPblH8d9NVqwIklDaYeZNH+l6Xy5bOhwbqGAGCwTsEEIEMoETVFF8KzRDO6ovUQtqg1W0DDNYR9MZ6Xxa1+DVHWi6u8PmEeeYN1j0SAmC0yKO4jKD0aPba6LbadtteeMI/49P8SE+Lxm378mhcujyN8Ffx/x8ATND6i0OAQAA';
            
    if (string.IsNullOrEmpty(seedInfo))
    {
        return;
    }

    byte[] inputBytes = Convert.FromBase64String(seedInfo);
    using (var readStream = new MemoryStream(inputBytes))
    {
        using (var gzipStream = new GZipStream(readStream, CompressionMode.Decompress))
        {
            using (var outputMemoryStream = new MemoryStream())
            {
                gzipStream.CopyTo(outputMemoryStream);
                byte[] outputBytes = outputMemoryStream.ToArray();
                string eventString = Encoding.UTF8.GetString(outputBytes);

                //处理一下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);
            }
        }
    }
}

解释:

  1. 使用 MemoryStream 创建一个内存流,用于保存解压缩后的数据。
  2. 使用 gzipStream.CopyTo(outputMemoryStream) 将解压缩后的数据写入内存流。
  3. 使用 outputMemoryStream.ToArray() 获取内存流中的数据,并将其转换为字节数组。
  4. 使用 Encoding.UTF8.GetString(outputBytes) 将字节数组转换为字符串。

通过以上修改,代码可以正确地处理解压缩后的 JSON 字符串,避免了长度异常的问题。

C#代码优化:处理GZip压缩的JSON字符串长度异常

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

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