la compression zlib tableau d'octets?
J'ai cette non compressé tableau d'octets:
0E 7C BD 03 6E 65 67 6C 65 63 74 00 00 00 00 00 00 00 00 00 42 52 00 00 01 02 01
00 BB 14 8D 37 0A 00 00 01 00 00 00 00 05 E9 05 E9 00 00 00 00 00 00 00 00 00 00
00 00 00 00 01 00 00 00 00 00 81 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 05 00 00 01 00 00 00
Et j'ai besoin de le comprimer à l'aide de l'algorithme deflate (zlib), à partir de ce que j'ai cherché l'équivalent en C# serait à l'aide de GZipStream mais je ne peut pas correspondre à la comprimé a abouti à tous.
Ici est la compression de code:
public byte[] compress(byte[] input)
{
using (MemoryStream ms = new MemoryStream())
{
using (GZipStream deflateStream = new GZipStream(ms, CompressionMode.Compress))
{
deflateStream.Write(input, 0, input.Length);
}
return ms.ToArray();
}
}
Ici est le résultat de la au-dessus de la compression code:
1F 8B 08 00 00 00 00 00 04 00 ED BD 07 60 1C 49 96 25 26 2F 6D CA 7B 7F 4A F5 4A
D7 E0 74 A1 08 80 60 13 24 D8 90 40 10 EC C1 88 CD E6 92 EC 1D 69 47 23 29 AB 2A
81 CA 65 56 65 5D 66 16 40 CC ED 9D BC F7 DE 7B EF BD F7 DE 7B EF BD F7 BA 3B 9D
4E 27 F7 DF FF 3F 5C 66 64 01 6C F6 CE 4A DA C9 9E 21 80 AA C8 1F 3F 7E 7C 1F 3F
22 7E 93 9F F9 FB 7F ED 65 7E 51 E6 D3 F6 D7 30 CF 93 57 BF C6 AF F1 6B FE 5A BF
E6 AF F1 F7 FE 56 7F FC 03 F3 D9 AF FB 5F DB AF 83 E7 0F FE 35 23 1F FE BA F4 FE
AF F1 6B FC 1A FF 0F 26 EC 38 82 5C 00 00 00
Voici le résultat, je suis dans l'attente d':
78 9C E3 AB D9 CB 9C 97 9A 9E 93 9A 5C C2 00 03 4E 41 0C 0C 8C 4C 8C 0C BB 45 7A
CD B9 80 4C 90 18 EB 4B D6 97 0C 28 00 2C CC D0 C8 C8 80 09 58 21 B2 00 65 6B 08
C8
Ce que je fais de mal, peut-on m'aider ?
Pourquoi attendez-vous le même résultat à partir de différentes implémentations? Il existe de nombreuses façons de compresser certains éléments de contenu qui peut être décompressé avec le même décompresseur. Mais dans votre cas, la zip de flux semble sortie d'une sorte d'en-tête.
Non seulement le GZipStream du résultat différent, mais il est plus grand que le non compressé d'entrée!
que beaucoup j'ai déjà compris, c'est pourquoi je suis à la recherche de comment faire iqual en essayant de trouver ce que je fais de mal, comme je l'ai dit j'ai besoin d'utiliser le dégonfler la mise en œuvre de zlib en C#. @CodeInChaos je ne savais pas que c'était différent de la mise en œuvre, j'ai été la recherche autour de TELLEMENT et j'ai trouvé quelques réponses indiquant que GZip était l'équivalent pour elle, je n'ai trouver que c'était pas quand j'ai commencé à le tester.
Mis à part l'augmentation de la taille, je suppose, est un autre programme decompresing. Comment cela va?
Non seulement le GZipStream du résultat différent, mais il est plus grand que le non compressé d'entrée!
que beaucoup j'ai déjà compris, c'est pourquoi je suis à la recherche de comment faire iqual en essayant de trouver ce que je fais de mal, comme je l'ai dit j'ai besoin d'utiliser le dégonfler la mise en œuvre de zlib en C#. @CodeInChaos je ne savais pas que c'était différent de la mise en œuvre, j'ai été la recherche autour de TELLEMENT et j'ai trouvé quelques réponses indiquant que GZip était l'équivalent pour elle, je n'ai trouver que c'était pas quand j'ai commencé à le tester.
Mis à part l'augmentation de la taille, je suppose, est un autre programme decompresing. Comment cela va?
OriginalL'auteur Guapo | 2011-06-08
Vous devez vous connecter pour publier un commentaire.
D'abord, quelques informations: DEFLATE est l'algorithme de compression, il est défini en RFC 1951. DÉGONFLER est utilisé dans la ZLIB et GZIP formats définis dans RFC 1950 et Mille neuf cent cinquante deux respectivement, qui sont essentiellement des wrappers minces autour de DÉGONFLER bytestreams. Les wrappers de fournir des métadonnées telles que le nom du fichier, horodateurs, Crc ou Adlers, et ainsi de suite.
.NET de base de la bibliothèque de la classe implémente une DeflateStream qui produit un cru DÉGONFLER bytestream, lorsqu'il est utilisé pour la compression. Lorsque utilisé dans de décompression, il consomme cru DÉGONFLER bytestream. .NET fournit également un GZipStream, qui est juste un GZIP wrapper autour de la base. Il n'y a pas de ZlibStream dans le .NET de la bibliothèque de classes de base - rien de ce que produit ou consomme de la ZLIB. Il y a quelques astuces pour le faire, vous pouvez rechercher autour de.
Le dégonfler logique .NET présente une anomalie comportementale, où, auparavant, les données compressées peuvent vraiment être gonflé, de manière significative, lorsque "compressé". Ce fut la source de un Connecter bug soulevé avec Microsoft, et a été discuté ici sur DONC. C'est peut être ce que vous voyez, dans la mesure inefficace de compression. Microsoft ont rejeté le bug, parce qu'elle est inefficace pour économiser de l'espace, le flux compressé n'est pas valide, en d'autres termes, il peut être "décompressé" par tout conforme à DÉGONFLER moteur.
En tout cas, que quelqu'un d'autre a posté, le comprimé bytestream produite par les compresseurs différents ne peuvent pas nécessairement être la même. Cela dépend de leurs paramètres par défaut, et l'application paramètres spécifiés pour le compresseur. Même si le comprimé bytestreams sont différents, ils peuvent encore décompresser à la même origine bytestream. D'autre part, la chose que vous avez utilisé pour compresser était GZIP, bien qu'il semble que ce que vous voulez est ZLIB. Alors qu'ils sont liés, ils ne sont pas les mêmes; vous ne pouvez pas utiliser GZipStream pour produire un ZLIB bytestream. C'est la principale source de la différence que vous voyez.
Je pense que vous voulez un ZLIB flux.
La libre géré Zlib dans le DotNetZip projet met en œuvre la compression de flux pour tous les trois formats (DEFLATE, ZLIB, GZIP). Le DeflateStream et GZipStream fonctionnent de la même manière que l' .NET builtin classes, et il y a un ZlibStream classe là, qu'est-ce que vous pensez que cela fonctionne. Aucune de ces classes présentent le comportement de l'anomalie que j'ai décrit ci-dessus.
Dans le code ressemble à ceci:
La sortie ressemble à ceci:
Pour décompresser,
Vous pouvez voir la documentation sur la statique CompressBuffer méthode.
MODIFIER
La question est, pourquoi est-DotNetZip la production de
78 DA
pour les deux premiers octets au lieu de78 9C
? La différence est négligeable.78 DA
code "max" compression, tandis que78 9C
code "de compression par défaut". Comme vous pouvez le voir dans les données, pour ce petit échantillon, le réel d'octets compressés sont exactement les mêmes que ce soit en utilisant les MEILLEURES ou par DÉFAUT. Aussi, le niveau de compression de l'information n'est pas utilisée lors de la décompression. Il n'a pas d'effet dans votre application.Si vous ne voulez pas "max" de la compression, en d'autres termes, si vous êtes très mis sur l'obtention de
78 9C
comme les deux premiers octets, même si elle n'a pas d'importance, alors vous ne pouvez pas utiliser leCompressBuffer
fonction de commodité, qui utilise le meilleur niveau de compression sous les couvertures. Au lieu de cela, vous pouvez faire ceci:Le résultat est:
Je ne sais pas ZLib.Net. J'ai donné le code pour DotNetZip ci-dessus.
merci Il semble plutôt simple pour décompresser à l'aide, je vais essayer car j'ai des problèmes de la décompression de l'autre lib.
DotNetZip toujours le compresser avec 1 octets est différent "78 DA" au lieu de "78 9C" à la très commencer alors que lorsque j'utilise ZLib.Net il fonctionne très bien me donner 9C au lieu de DA, dépose qu'il fonctionne très bien pour décompresser ne sais pas pourquoi il change 9C de DA pour l'instant...
Il n'importe pas vraiment si la 2ème octet est 9C ou DA. ZLIB a un 2 octets d'en-tête, le premier octet indique la méthode de compression et la taille de la fenêtre si DÉGONFLER est utilisé. C'est toujours 78. L'octet suivant varie, et indique 3 choses: si un preset dictionnaire a été utilisé, le niveau de compression, et une somme de contrôle de toutes sortes sur la 1ère deux octets. En effet, 9C indique comp de niveau "par défaut", alors que DA indique la compression de niveau "max". Cette information n'est pas nécessaire pour la décompression; il est intéressant de noter que si votre application prend en considération si la compression supplémentaire peut être utile. Vous pouvez l'ignorer.
OriginalL'auteur Cheeso
Tout simplement ce que vous en avez eu un en-tête GZip. Ce que vous voulez, c'est le plus simple Zlib-tête. ZLib a des options pour l'en-tête GZip, Zlib-tête ou pas d'en-tête. Généralement la Zlib en-tête est utilisé, sauf si les données sont associées à un fichier de disque (dans ce cas, GZip-tête est utilisé.) Apparemment, il n'existe aucun moyen .Net-library pour écrire un zlib-tête (même si c'est de loin la plus fréquente en-tête utilisé dans les formats de fichier). Essayez http://dotnetzip.codeplex.com/.
Vous pouvez rapidement tester toutes les différentes zlib en utilisant les options de HexEdit (Opérations->Compression->Paramètres). Voir http://www.hexedit.com . Il m'a fallu 10 minutes pour vérifier vos données simplement en collant votre octets compressés dans HexEdit et de la décompression. Aussi essayé la compression de votre orignal octets avec GZip et ZLib-têtes comme une double vérification. Notez que vous pouvez avoir à jouer avec les paramètres pour obtenir exactement les octets que vous attendiez.
OriginalL'auteur Andrew W. Phillips