I am trying to use some libraries to compress and decompress a string in C#. I am still relatively new to this but I would expect that if I am using the same library to compress and decompress, there should not be any issues. The string I am trying to compress is basically like an XML like type structure.
I am receiving an exception as follows when trying to decompress the compressed data: System.IO.InvalidDataException: 'The archive entry was compressed using an unsupported compression method.'
This exception is being encountered on this line in my code: gzip.CopyTo(decompressedStream);
My whole program code can be seen below:
using System.IO.Compression;
using System.Text;
namespace StringCompression
{
class Program
{
static void Main(string[] args)
{
#region
string xml = "< RadelNodeTestCase > < RadelNodeTests > < RadelNodeTest > < digitalOutputs /> < switchCurrents /> < PostDigitalOutputControl /> < digitalOutputValidation /> < expectedDigitalInputs /> < actualDigitalInputs /> < Name > Initialisation </ Name > < IdNumber > LRU3 Test </ IdNumber > < IdNumbers > < string > LRU3 Test </ string > </ IdNumbers > < Revisions /> < Comment > Checks the initial state of the unit</Comment> <NoVoltageMeasurementFlag>false</NoVoltageMeasurementFlag> <UserPrompt>Re-connect power</UserPrompt> <Outcome>PASS</Outcome> <VoltageMeasurements> <VoltageMeasurement> <connector>C750</connector> <wireNo>R</wireNo> <testPoint>A2</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>S</wireNo> <testPoint>A3</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>T</wireNo> <testPoint>A4</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>U</wireNo> <testPoint>A5</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>V</wireNo> <testPoint>A6</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0.001</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>W</wireNo> <testPoint>A7</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>X</wireNo> <testPoint>A8</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>Y</wireNo> <testPoint>A9</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0.011</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>b</wireNo> <testPoint>A10</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0.001</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>d</wireNo> <testPoint>A11</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0.001</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>e</wireNo> <testPoint>A12</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0.011</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>f</wireNo> <testPoint>A13</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>g</wireNo> <testPoint>A14</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0.01</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>h</wireNo> <testPoint>A15</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>j</wireNo> <testPoint>A16</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0.012</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>k</wireNo> <testPoint>A17</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>m</wireNo> <testPoint>A18</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0.012</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>n</wireNo> <testPoint>A19</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>p</wireNo> <testPoint>A20</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0.01</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>q</wireNo> <testPoint>A21</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>r</wireNo> <testPoint>A22</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>s</wireNo> <testPoint>A23</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>t</wireNo> <testPoint>A24</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>u</wireNo> <testPoint>A25</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>v</wireNo> <testPoint>A26</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0.012</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C750</connector> <wireNo>w</wireNo> <testPoint>A27</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C780</connector> <wireNo>J</wireNo> <testPoint>A28</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C780</connector> <wireNo>H</wireNo> <testPoint>A29</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C780</connector> <wireNo>G</wireNo> <testPoint>A30</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C760</connector> <wireNo>K</wireNo> <testPoint>A31</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C760</connector> <wireNo>J</wireNo> <testPoint>A32</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C760</connector> <wireNo>H</wireNo> <testPoint>A33</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C760</connector> <wireNo>E</wireNo> <testPoint>A34</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C760</connector> <wireNo>C</wireNo> <testPoint>A35</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> <VoltageMeasurement> <connector>C760</connector> <wireNo>A</wireNo> <testPoint>A36</testPoint> <connectorRef>C750</connectorRef> <wireNoRef>f</wireNoRef> <testPointRef>A13</testPointRef> <NumberOfSamples>1</NumberOfSamples> <Min>-0.5</Min> <Max>0.5</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </VoltageMeasurement> </VoltageMeasurements> <ExpectedActiveSpos /> <ActualActiveSpos /> <InactiveSpos /> <SposCheckPass>true</SposCheckPass> <ExpectedCanMessagesReceived>true</ExpectedCanMessagesReceived> <ConnectionTests /> <VoltageImports /> <MeasuredHighOutputs /> <ExpectedHighOutputs /> <SposHighOutputs /> <digitalOutputValidationPassed>false</digitalOutputValidationPassed> <AnalogInputs> <AnalogInput> <CanId>177</CanId> <Number>1</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>2</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>3</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>4</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>5</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>6</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>7</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>8</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>9</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>10</Number> <Min>0</Min> <Max>2</Max> <Measurement>0.02</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>11</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>12</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>13</Number> <Min>0</Min> <Max>2</Max> <Measurement>0.02</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>14</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>15</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>16</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>17</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>18</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>19</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>20</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>21</Number> <Min>0</Min> <Max>30</Max> <Measurement>0.34</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>177</CanId> <Number>22</Number> <Min>0</Min> <Max>25</Max> <Measurement>24.37</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>178</CanId> <Number>1</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>178</CanId> <Number>2</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>178</CanId> <Number>3</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput> <AnalogInput> <CanId>178</CanId> <Number>4</Number> <Min>0</Min> <Max>2</Max> <Measurement>0</Measurement> <Outcome>PASS</Outcome> </AnalogInput>";
#endregion
string result;
byte[] xmlBytes = Encoding.UTF8.GetBytes(xml);
using (var stream = new MemoryStream())
using (var gzip = new GZipStream(stream, CompressionMode.Compress))
{
gzip.Write(xmlBytes, 0, xmlBytes.Length);
gzip.Close();
byte[] compressed = stream.ToArray();
result = Encoding.UTF8.GetString(compressed);
Console.WriteLine($"Compressed size: {compressed.Length} bytes");
Console.WriteLine($"Original size: {xmlBytes.Length} bytes");
}
string compressedString = result;
byte[] compressedBytes = Encoding.UTF8.GetBytes(compressedString);
using (var compressedStream = new MemoryStream(compressedBytes))
using (var decompressedStream = new MemoryStream())
using (var gzip = new GZipStream(compressedStream, CompressionMode.Decompress))
{
gzip.CopyTo(decompressedStream);
byte[] decompressedBytes = decompressedStream.ToArray();
string decompressedString = Encoding.UTF8.GetString(decompressedBytes);
Console.WriteLine($"Decompressed string size: {decompressedString.Length}");
}
}
}
}
I tried to compress the data using the GZip library, and I believe the data is being compressed correctly because the size if significantly reduced. However when I try to decompress the data, I am experiencing issues.
Any assistance is appreciated, sorry if this is a trivial task, I am still kind of getting to grips with this.
You compression/decompression code is fine, the issue is in the compression result representation.
You use Encoding.UTF8.GetString(compressed)
, but gzip does not guarantee that the resulting byte sequence is a valid UTF8 string, so doing Encoding.UTF8.GetBytes
later results in a different byte array.
So you either have to change the way you represent the result of compression, or keep it as a byte array.
Base64 encoding is often used to represent byte sequences as a string, so if you use Convert.ToBase64String
and Convert.FromBase64String
this code should work.