Domanda

Il mio cliente TCP riceve un'immagine all'interno di un'immagine packet.The è compresso con compito zlib.The è per decomprimere l'immagine e metterlo sul modulo.

ho intenzione di salvare l'immagine compressa nella directory corrente, decomprimerlo e caricare il file decompresso sul modulo.

Il primo problema viene fornito con il salvataggio del file (compresso) .La zlib può salvare è decompresso.

Il codice sotto carica il file compresso e lo salva dopo la decompressione.

    private void decompressFile(string inFile, string outFile)
    {
        System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create);
        zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream);
        System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);          
        try
        {
            CopyStream(inFileStream, outZStream);
        }
        finally
        {
            outZStream.Close();
            outFileStream.Close();
            inFileStream.Close();
        }
    }

    public static void CopyStream(System.IO.Stream input, System.IO.Stream output)
    {
        byte[] buffer = new byte[2000];
        int len;
        while ((len = input.Read(buffer, 0, 2000)) > 0)
        {
            output.Write(buffer, 0, len);
        }
        output.Flush();
    }

Come passare la matrice di byte [] direttamente a tale funzione? Sto pensando di salvarlo come compressa e quindi chiamare la funzione con la posizione del file compresso, ma non so né come salvare un file da un byte [] array, né un modo per passare l'array di byte [] come il file di input.

Ogni aiuto sarà molto apprezzato.

Grazie.

È stato utile?

Soluzione

usando i System.IO.File.WriteAllBytes static void (string path, byte [] bytes) metodo.

byte[] buffer = new byte[200];
File.WriteAllBytes(@"c:\data.dmp", buffer);

Altri suggerimenti

public static void SaveFile(this Byte[] fileBytes, string fileName)
{
    FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);
    fileStream.Write(fileBytes, 0, fileBytes.Length);
    fileStream.Close();
}

In aggiunta a ciò che chiunque altro ha già detto, vorrei anche suggerire di usare 'usando' clausole in quanto tutti quegli oggetti implementano IDisposable.

using(FileStream outFileStream = new ...)
using(ZOutputStream outZStream = new ...)
using(FileStream inFileStream = new ...)
{
    CopyStream(inFileStream, outZStream);
}

Stick l'array di byte che hai ricevuto in un MemoryStream e comprimere / decomprimere al volo senza l'utilizzo di file temporanei.

Si può provare questo codice

 private void t1()
    {
        FileStream f1 = new FileStream("C:\\myfile1.txt", FileMode.Open);
        int length = Convert.ToInt16(f1.Length);
        Byte[] b1 = new Byte[length];
        f1.Read(b1, 0, length);
        File.WriteAllBytes("C:\\myfile.txt",b1);
        f1.Dispose();
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top