Skip to content

Instantly share code, notes, and snippets.

@mitkabraun
Created May 13, 2025 16:37
Show Gist options
  • Save mitkabraun/d6144ce409facac3cc9e357f9e3a036c to your computer and use it in GitHub Desktop.
Save mitkabraun/d6144ce409facac3cc9e357f9e3a036c to your computer and use it in GitHub Desktop.
Пример распаковки конфигурации (содержимого config\surfaces\CDATA) Администратор ОПС "Firesec" 3.2.9.0
internal static class Program
{
private static void Main()
{
try
{
var base64CompressedData =
"""
ZCMPeNqVk8GO0zAQhu/7FJbvpXFsp4nUdNXSDeJKiwRckDd120hpEsXuQm8s0p44IB4AOPAC1Yqyi6B9
BueNmKRNt7sIVZwyY8989v9P3D59O4vRhcxVlCY+Jo8sjGQSpqMomfh4rscNF592Ttpqno9FKNX9
0k69jkZyLOax9nEgYiUx0otM+jiMhVJRiNGbaKSn0GMBfiqjyRQqOcShyHRFM5/Mytwgc2t+Q7A2
txhN8mg0rDD2Nhlomb0oIXfpy22qEpEN0yewCDlGIomCXMykqrLB/HywUFrOfAylZYlNHWK1aMst
FcRiIfNqmViOTQgljGOUQDvc6qv5ZZZmDXpykahM5ODNouQ0Dxtt7nKXupTY+8bPZlVcmuvio7kp
AWZdfDArBMmmDB/yvAdAwlxGqOPxw5tszA+zLN4dR3XaMpYzmWi1j1A1CR8Pg8HrV2kiB1ORyZ0Z
3HJbDuUWgcZchhrFcqy3vuo0q4go346MQXieap2Cl4RXl27uTriL4NRmJeVQESM2SOIMLK8VfSmu
QM3/m0Md3qIOc4l1YM4KUKviCgjfjxMcxiyPWp6zB3wrLov3gNiYn2Vkrs3y75kf8bUvL6Kwdraf
R/BSnj/t+7jPg16PnLmNbmC7DWa3vEaX9M4aDrP6xPHIYxowjJ6lWmjZTSaxLCXu/lTKwTjPdSx6
fzh2PRxi/2M67Ph0mrvH22lP8nSeqd1350nVXm/Upapz8gddl4Mk
""";
// 1. Удаляем "ZCMP" и декодируем Base64
base64CompressedData = base64CompressedData.Trim();
base64CompressedData = base64CompressedData.Substring(4);
var compressedData = Convert.FromBase64String(base64CompressedData);
// 2. Обрезаем zlib-заголовок (первые 2 байта: 0x78 0x9C)
var compressedDataWithoutHeader = new byte[compressedData.Length - 2];
Array.Copy(compressedData, 2, compressedDataWithoutHeader, 0, compressedDataWithoutHeader.Length);
// 3. Распаковываем через DeflateStream
byte[] decompressedData;
using (var ms = new MemoryStream(compressedDataWithoutHeader))
using (var ds = new DeflateStream(ms, CompressionMode.Decompress))
using (var output = new MemoryStream())
{
ds.CopyTo(output);
decompressedData = output.ToArray();
}
// 4. Выводим результат
var text = Encoding.UTF8.GetString(decompressedData);
Console.WriteLine("Распакованные данные:");
Console.WriteLine(text);
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
}
@mitkabraun
Copy link
Author

mitkabraun commented May 13, 2025

Распакованные данные:
<?xml version="1.0" encoding="utf-8"?> <surfaces version="1.0"><surface default="False" type="classic" width="100" height="50" caption="Без имени" gridType="2" gridStepX="10" gridStepY="10" snapToGrid="1" aniFrames="1" SubSystem="0" id="2361073780"><layer id="1062113145" name="План" transparency="0"/><layer id="2585838312" name="Несвязанные зоны" transparency="90"/><layer id="1484136955" name="Пожарные зоны" transparency="90"><elements><element class="TFS_ZoneShape" id="2508763501"><rect left="10" top="90" right="40" bottom="150"/></element></elements></layer><layer id="4128415480" name="Охранные зоны" transparency="90"/><layer id="3657364810" name="Переходы" transparency="90"/><layer id="644093096" name="Устройства" transparency="0"><elements><element class="TFS_DeviceShape" DriverUID="D5FBB1E8-AF28-4279-A1BE-640D1691C3F4" RotateAngle="360" id="3541298603"><rect left="20" top="120" right="40" bottom="140"/></element></elements></layer></surface><groups><group name=""/></groups></surfaces>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment