C#代码优化:处理GZip压缩的JSON字符串长度异常
这段代码处理后的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);
}
}
}
}
解释:
- 使用
MemoryStream创建一个内存流,用于保存解压缩后的数据。 - 使用
gzipStream.CopyTo(outputMemoryStream)将解压缩后的数据写入内存流。 - 使用
outputMemoryStream.ToArray()获取内存流中的数据,并将其转换为字节数组。 - 使用
Encoding.UTF8.GetString(outputBytes)将字节数组转换为字符串。
通过以上修改,代码可以正确地处理解压缩后的 JSON 字符串,避免了长度异常的问题。
原文地址: https://www.cveoy.top/t/topic/qzyu 著作权归作者所有。请勿转载和采集!