Come rimuovi e aggiungi byte da un array di byte in C #

Ho un file di configurazione (.cfg) che sto usando per creare un’applicazione a riga di comando per aggiungere utenti a un’applicazione server SFTP.

Il file cfg deve avere un certo numero di byte riservati per ciascuna voce nel file cfg. Attualmente sto aggiungendo un nuovo utente alla fine del file creando un array di byte e convertendolo in una stringa, quindi copiandolo nel file, ma ho trovato un problema. Il file di configurazione richiede 4 byte alla fine del file.

Il processo che devo compiere è rimuovere questi byte finali dal file, aggiungere il nuovo utente, quindi aggiungere i byte alla fine.

Quindi, ora che hai qualche contesto dietro il mio problema.

Ecco la domanda:

Come rimuovi e aggiungi byte da un array di byte?

Ecco il codice che ho ottenuto finora, legge l’utente da un file e lo aggiunge ad un altro.

static void Main(string[] args) { System.Text.ASCIIEncoding code = new System.Text.ASCIIEncoding(); //Encoding in ascii to pick up mad characters StreamReader reader = new StreamReader("one_user.cfg", code, false, 1072); string input = ""; input = reader.ReadToEnd(); //convert input string to bytes byte[] byteArray = Encoding.ASCII.GetBytes(input); MemoryStream stream = new MemoryStream(byteArray); //Convert Stream to string StreamReader byteReader = new StreamReader(stream); String output = byteReader.ReadToEnd(); int len = System.Text.Encoding.ASCII.GetByteCount(output); using (StreamWriter writer = new StreamWriter("freeFTPdservice.cfg", true, Encoding.ASCII, 5504)) { writer.Write(output, true); writer.Close(); } Console.WriteLine("Appended: " + len); Console.ReadLine(); reader.Close(); byteReader.Close(); } 

Per cercare di illustrare questo punto, ecco un “diagramma”.

1) Aggiungi primo utente

File (testo aggiunto) Byte alla fine (zeri)

2) Aggiungi un secondo utente

File (testo aggiunto) (testo aggiunto) byte alla fine (zeri)

e così via.

Non lo fai. È ansible copiare su un nuovo array della dimensione desiderata. Oppure puoi lavorare con una List e quindi creare una matrice da quella.

Ma, nel tuo caso, suggerirei di esaminare i flussi di file stessi … ti permettono di leggere e scrivere singoli byte o matrici di byte e inoltre:

  • Cercare

che ti consente di spostarti in posizioni arbitrarie nel file … Quindi, per il caso d’uso che hai descritto, lo faresti

  • apri il file (per accesso in lettura / scrittura)
  • sposta alla fine del file
  • torna indietro di quattro byte (sai quali sono? in caso contrario, sarebbe un buon momento per riporli)
  • scrivi il nuovo utente
  • scrivi i quattro byte
  • chiudi il file

Qualcosa come questo:

 using (var fs = new FileStream(PATH, FileMode.Open, FileAccess.ReadWrite)) { fs.Seek(-4, SeekOrigin.End); fs.Write(userBytes); fs.Write(fourBytesAtEnd); } 

Questo ha anche il vantaggio di non dover trascinare l’intero file e scriverlo di nuovo.

Per rispondere esplicitamente alla tua domanda: come rimuovi e aggiungi byte da un array di byte?

Puoi farlo solo creando un nuovo array e copiandone i byte.

Fortunatamente, questo è semplificato usando Array.Resize() :

 byte[] array = new byte[10]; Console.WriteLine(array.Length); // Prints 10 Array.Resize(ref array, 20); // Copies contents of old array to new. Console.WriteLine(array.Length); // Prints 20 

Se è necessario rimuovere i byte dall’inizio – I byte di Array.Copy prima e poi ridimensionare (o copiare nel nuovo array se non ti piace ref ):

 // remove 42 bytes from beginning of the array, add size checks as needed Array.Copy(array, 42, array, 0, array.Length-42); Array.Resize(ref array, array.Length-42);