|
dev
newsgroups
|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
Compression namespace for ArrayI would like to use Compression namespace for Array, i.e. use .NET native Compression for compress a String, or an Array of Integer whose elements are returned values of AscW for each char of the String. I tried with the code available @ http://msdn2.microsoft.com/en-us/library/system.io.compression.gzipstream(VS.80).aspx but with no success 'cause I obtained ms.lenght > buffer.length. This is my source code for CompressData: Private Sub CompressData() Dim BUFFERSIZE As Integer = DataArray.Length * Marshal.SizeOf(DataArray(0)) Dim buffer(BUFFERSIZE - 1) As Byte 'Dump integer Array DataArray in Byte Array buffer Dim IndexValue As Integer = 0 For Index As Integer = 0 To BUFFERSIZE - 1 If ((Index << 31) = 0) Then ' if Even buffer(Index) = (DataArray(IndexValue) >> 8) Else buffer(Index) = (DataArray(IndexValue) And &HFF) IndexValue += 1 End If Next Dim ms As New MemoryStream() ' Use the newly created memory stream for the compressed data. Dim compressedzipStream As New GZipStream(ms, CompressionMode.Compress, True) compressedzipStream.Write(buffer, 0, buffer.Length) ' Close the stream. compressedzipStream.Close() Dim BufferOut() As Byte = ms.ToArray() End Sub I've got the same problem also for DecompressData with the added difficulty of using chunk of Bytes, as reported in the previous MDSN article. What I'm doing wrong? Is there any work-around, any trick to use Compression not only for stream file but also for Array of Objects? Do you have any suggestion? Are there any commercial libraries, with no redistribuition license, doing this? Thanks Why not just encode the string so that you get an array of bytes?
Fla wrote: Show quote > Hi! > I would like to use Compression namespace for Array, i.e. use .NET > native Compression for compress a String, or an Array of Integer whose > elements are returned values of AscW for each char of the String. > I tried with the code available @ > http://msdn2.microsoft.com/en-us/library/system.io.compression.gzipstream(VS.80).aspx > but with no success 'cause I obtained ms.lenght > buffer.length. > > This is my source code for CompressData: > > Private Sub CompressData() > Dim BUFFERSIZE As Integer = DataArray.Length * > Marshal.SizeOf(DataArray(0)) > Dim buffer(BUFFERSIZE - 1) As Byte > > 'Dump integer Array DataArray in Byte Array buffer > Dim IndexValue As Integer = 0 > For Index As Integer = 0 To BUFFERSIZE - 1 > If ((Index << 31) = 0) Then ' if Even > buffer(Index) = (DataArray(IndexValue) >> 8) > Else > buffer(Index) = (DataArray(IndexValue) And &HFF) > IndexValue += 1 > End If > > Next > > Dim ms As New MemoryStream() > ' Use the newly created memory stream for the compressed data. > Dim compressedzipStream As New GZipStream(ms, > CompressionMode.Compress, True) > compressedzipStream.Write(buffer, 0, buffer.Length) > ' Close the stream. > compressedzipStream.Close() > Dim BufferOut() As Byte = ms.ToArray() > > End Sub > > I've got the same problem also for DecompressData with the added > difficulty of using chunk of Bytes, as reported in the previous MDSN > article. > > What I'm doing wrong? Is there any work-around, any trick to use > Compression not only for stream file but also for Array of Objects? Do > you have any suggestion? > Are there any commercial libraries, with no redistribuition license, > doing this? > > Thanks > Hi!
Did you mean System.Text.Encoding.ASCII.GetBytes as the following code lines? Dim Buffer() As Byte = System.Text.Encoding.ASCII.GetBytes(StringChar) with For Index As Integer = 0 To 299 StringChar &= ChrW(Index + 255) Next Thanks Göran Andersson ha scritto: Show quote > Why not just encode the string so that you get an array of bytes? > > > Fla wrote: > > Hi! [...] > > Yes. Except that you would need to use a dirrerent encoding to handle
characters that is not in the ASCII character set, like UTF8. Fla wrote: Show quote > Hi! > Did you mean System.Text.Encoding.ASCII.GetBytes as the following code > lines? > > > Dim Buffer() As Byte = System.Text.Encoding.ASCII.GetBytes(StringChar) > > with > > For Index As Integer = 0 To 299 > StringChar &= ChrW(Index + 255) > Next > > Thanks > > Göran Andersson ha scritto: > >> Why not just encode the string so that you get an array of bytes? >> >> >> Fla wrote: >>> Hi! > [...] > Göran Andersson ha scritto:
> Yes. Except that you would need to use a dirrerent encoding to handle I can compress and decompress Array of bytes but I can't do this if I> characters that is not in the ASCII character set, like UTF8. dump the interrmediate compress byte() in a string. I'm using encoding.unicode.getstring to dump the intermediate compress byte() on a string and I'm using encoding.unicode.getbytes to get the array of bytes to be uncompressed. I can't get the result 'cause Deflate.Read(..) returns zero; I noticed that when I try to dump the compressed byte array on a string, I get less char as I forecast: CompressedBuffer.length = 119 while CompressedString.Length = 57 using Dim CompressedString As String = Encoding.Unicode.GetString(CompressedBuffer). I expected CompressedString.Length = CeilingUpper(119/2) = 60. I'm using unicode compression in order to get a String with Char in Unicode coding 'cause I need 2 bytes per char and storing a number 0 to 65535 in each char. Then I dump the this Unicode coded string on a field of a db. Any ideas? How could I dump the compressed array of bytes on an intermediate string? Show quote > > Fla wrote: > > Hi! > > Did you mean System.Text.Encoding.ASCII.GetBytes as the following code > > lines? > > > > > > Dim Buffer() As Byte = System.Text.Encoding.ASCII.GetBytes(StringChar) > > > > with > > > > For Index As Integer = 0 To 299 > > StringChar &= ChrW(Index + 255) > > Next > > > > Thanks > > > > Göran Andersson ha scritto: > > > >> Why not just encode the string so that you get an array of bytes? > >> > >> > >> Fla wrote: > >>> Hi! > > [...] > > Have you checked out System.String.Intern? I saved about 30% using this in
a geocoder with millions of street names. No compression required.. If you have some binary data in an array, you can't just treat it as if
it was an encoded string, because then you will lose some data when it's decoded. If you want a string representation of binary data, you can use the Convert.ToBase64String and Convert.FromBase64String methods to convert to and from a base 64 string. Fla wrote: Show quote > Göran Andersson ha scritto: > >> Yes. Except that you would need to use a dirrerent encoding to handle >> characters that is not in the ASCII character set, like UTF8. > > I can compress and decompress Array of bytes but I can't do this if I > dump the interrmediate compress byte() in a string. I'm using > encoding.unicode.getstring to dump the intermediate compress byte() on > a string and I'm using encoding.unicode.getbytes to get the array of > bytes to be uncompressed. > I can't get the result 'cause Deflate.Read(..) returns zero; I noticed > that when I try to dump the compressed byte array on a string, I get > less char as I forecast: CompressedBuffer.length = 119 while > CompressedString.Length = 57 using > Dim CompressedString As String = > Encoding.Unicode.GetString(CompressedBuffer). > I expected CompressedString.Length = CeilingUpper(119/2) = 60. > I'm using unicode compression in order to get a String with Char in > Unicode coding 'cause I need 2 bytes per char and storing a number 0 to > 65535 in each char. Then I dump the this Unicode coded string on a > field of a db. > > Any ideas? How could I dump the compressed array of bytes on an > intermediate string? > >> Fla wrote: >>> Hi! >>> Did you mean System.Text.Encoding.ASCII.GetBytes as the following code >>> lines? >>> >>> >>> Dim Buffer() As Byte = System.Text.Encoding.ASCII.GetBytes(StringChar) >>> >>> with >>> >>> For Index As Integer = 0 To 299 >>> StringChar &= ChrW(Index + 255) >>> Next >>> >>> Thanks >>> >>> Göran Andersson ha scritto: >>> >>>> Why not just encode the string so that you get an array of bytes? >>>> >>>> >>>> Fla wrote: >>>>> Hi! >>> [...] >>> > |
|||||||||||||||||||||||