2011-01-11 2 views
1

Y a-t-il un moyen de savoir si l'octet [] a été compressé (ou pas) par GzipStream .net class?Y at-il un moyen de savoir si l'octet [] a été compressé par gzipstream?

EDIT: veux juste savoir si l'octet [] tableau a été compressé (depuis que je serai toujours en utilisant GZipStream pour compresser et décompresser)

+1

Où trouvez-vous l'octet [] à partir? –

+0

@Mark: à partir de l'exécution de WCF. Son réellement ArraySegment stackoverflowuser

Répondre

1

vous pouvez regarder les premiers octets de la magie En-tête pour voir si elle est gzippée, mais à moins que le compresseur. NET écrit des informations supplémentaires dans l'un des commentaires ou d'autres champs facultatifs, vous ne pouvez probablement pas dire qui était le compresseur.

http://www.onicos.com/staff/iz/formats/gzip.html

vous pouvez également regarder le champ de type OS pour voir si elle était FAT ou NTFS, mais cela ne fonctionne toujours pas vous dire qu'il a été écrit par C# ...

7

A GZipStream est un DeflateStream avec un en-tête supplémentaire et une bande-annonce.

Le format est spécifié en RFC 1952.


La classe .NET 4.0 GZipStream écrit les octets suivants tête:

byte[] headerBytes = new byte[] { 0x1f, 0x8b, 8, 0, 0, 0, 0, 0, 4, 0 }; 
if (compressionLevel == 10) 
{ 
    headerBytes[8] = 2; 
} 

La remorque se compose d'une somme de contrôle CRC32 et la longueur des données non compressées.

+0

merci. D'où vient la compressionLevel? Aussi je veux juste savoir si le byte [] a été compressé (peu importe si gzipstream ou deflatestream puisque j'utilise toujours GzipStream. Je suppose que je dois reformuler ma question). – stackoverflowuser

+0

@stackoverflowuser: Il n'est pas possible de déterminer de manière fiable si une séquence aléatoire d'octets représente ou non des données compressées, si les octets n'ont pas d'en-tête comme un GZipStream. – dtb

+0

merci pour l'explication. désolé mais je ne reçois toujours pas l'utilisation de l'extrait de code. J'ai un octet [] et il semble que l'extrait de code ci-dessus utilise compressionLevel (??) en définissant headerBytes. Pouvez-vous pls. mettre à jour l'extrait de code en considérant une entrée de byte [] – stackoverflowuser

1

Merci à l'explication de @ dtd, cela fonctionne pour moi: (@stackoverflowuser, vous voudrez peut-être cela?)

public static class CompressionHelper 
{ 
    public static byte[] GZipHeaderBytes = {0x1f, 0x8b, 8, 0, 0, 0, 0, 0, 4, 0}; 
    public static byte[] GZipLevel10HeaderBytes = {0x1f, 0x8b, 8, 0, 0, 0, 0, 0, 2, 0}; 

    public static bool IsPossiblyGZippedBytes(this byte[] a) 
    { 
     var yes = a.Length > 10; 

     if (!yes) 
     { 
      return false; 
     } 

     var header = a.SubArray(0, 10); 

     return header.SequenceEqual(GZipHeaderBytes) || header.SequenceEqual(GZipLevel10HeaderBytes); 
    } 
} 
+0

Comment utilisez-vous cette aide? Aide à quoi? –

+1

Une aide est simplement une classe statique que vous pouvez utiliser n'importe où sans avoir besoin d'instancier un objet en premier. Je l'utilise dans les tubes de réponse des modules Http: 'CompressHelper.IsPossiblyGZippedBytes (responseStream);' –

Questions connexes