问题
I'm looking for a LZW compression algorithm in C# that takes a "string" and returns a string. I've googling for hours and all I've found use MemoryStream, BinaryWriters, etc.
I just want to be able to do something like:
string _data = "12345";
string _result = CompressToLZW(_data);
and then pass that string via Ajax to the browser. I already have the LZW decompression algorithm for javascript (http://rosettacode.org/wiki/LZW_compression#JavaScript)
Thanks.-
UPDATE:
This is the code I'm using right now with http://paste.lisp.org/display/12198
string _data = "12345_12345_12345_12345";
byte[] byteArray = Encoding.ASCII.GetBytes(_data);
MemoryStream _st = new MemoryStream(byteArray);
StreamReader _sr = new StreamReader(_st);
MemoryStream streamoutput = new MemoryStream();
BinaryWriter _output= new BinaryWriter(streamoutput);
LZW.Compress(_sr, _output);
string _res = (new StreamReader(_output.BaseStream)).ReadToEnd();
return _res;
UPDATE 2 I found a source code in C# that does the work at http://code.google.com/p/sharp-lzw/source/browse/ Thanks.-
回答1:
Use something like this:
private string CompressToLZW(string input)
{
using (MemoryStream stream = new MemoryStream())
{
ComputeLZW(input, stream);
stream.Seek(0, SeekOrigin.Begin);
using (StreamReader reader = new StreamReader(stream))
{
return reader.ReadToEnd();
}
}
}
where ComputeLZW() is the LZW method you have that uses a stream.
回答2:
Given that LZW codes needn't necessarily fall on byte boundaries, simply converting the binary output of LZW compression to a UTF8 string (as with the StreamReader
approach) will most likely fail, producing illegal output.
It seems that the Javascript decompress function you refer to actually takes an array of numbers as its input. Probably the most efficient way to convey the binary output to the javascript decompress method would be to base64 encode the binary output, then to base64 decode at the JS end into a number array and to supply this to your method.
This might be of questionable efficiency. Worth testing before deploying.
回答3:
You can "convert" a string into a MemoryStrem like this:
byte[] byteArray = Encoding.ASCII.GetBytes(youInputString);
MemoryStream stream = new MemoryStream(byteArray);
(make sure you understand which encoding you need).
The other way goes like this:
StreamReader reader = new StreamReader(methodOutputStream);
string text = reader.ReadToEnd();
To use the methods found on http://paste.lisp.org/display/12198, you can first convert your string to a Stream, feed it to the LZW compression methods, receive an output Stream, and convert that stream to a string. The only difference is that the code on the site uses FileStreams.
来源:https://stackoverflow.com/questions/6710014/lzw-compression-on-c-sharp-from-string