Come faccio a rimuovere un numero di byte da un array di byte?Rimuovere i primi 16 byte?
risposta
EDIT: Come il commento di nobugz (e la risposta di Reed Copsey) menziona, se non effettivamente bisogno il risultato come un array di byte, si dovrebbe considerare di usare ArraySegment<T>
:
ArraySegment<byte> segment = new ArraySegment<byte>(full, 16, full.Length - 16);
In caso contrario, la copia sarà necessario: gli array hanno sempre una dimensione fissa, quindi non è possibile "rimuovere" i primi 16 byte dall'array esistente. Invece, dovrai creare un nuovo array più piccolo e copiare i dati rilevanti in esso.
suggerimento di Zach è nella giusta direzione per l'approccio non LINQ, ma può essere resa più semplice (questo presuppone che si conosce già la matrice originale è di almeno 16 byte di lunghezza):
byte[] newArray = new byte[oldArray.Length - 16];
Buffer.BlockCopy(oldArray, 16, newArray, 0, newArray.Length);
o
byte[] newArray = new byte[oldArray.Length - 16];
Array.Copy(oldArray, 16, newArray, 0, newArray.Length);
ho sospettoBuffer.BlockCopy
sarà leggermente più veloce, ma non so per certo.
Si noti che entrambi potrebbero essere significativamente più efficienti rispetto all'approccio LINQ se gli array coinvolti sono grandi: l'approccio LINQ richiede che ogni byte venga restituito singolarmente da un iteratore e le copie potenzialmente intermedie da realizzare (nello stesso come l'aggiunta di articoli a un List<T>
ha bisogno di aumentare periodicamente l'array di supporto). Ovviamente non ottimizzarlo, ma vale se si verifica se questo bit di codice è un collo di bottiglia delle prestazioni.
EDIT: Ho eseguito un benchmark molto "rapido e sporco" dei tre approcci. Non mi fido del benchmark per distinguere tra Buffer.BlockCopy
e Array.Copy
- erano piuttosto vicini - ma l'approccio LINQ era oltre 100 volte più lento.
Sul mio portatile, utilizzando array di byte di 10.000 elementi, sono stati necessari circa 10 secondi per eseguire 40.000 copie utilizzando LINQ; gli approcci di cui sopra hanno richiesto circa 80ms per fare lo stesso lavoro. Ho aumentato il numero di iterazioni a 4.000.000 e ci sono voluti solo circa 7 secondi. Ovviamente si applicano i normali avvertimenti sui micro-benchmark, ma questa è una differenza piuttosto significativa.
sicuramente utilizzare l'approccio di cui sopra, se questo è in un percorso di codice che è importante per le prestazioni :)
+1, il buffering è decisamente più efficiente per i grandi array. –
Qual è la differenza tra Buffer.BlockCopy e Array.Copy quando utilizzato con gli array di byte? – dtb
@dtb: Non mi aspetto che ci siano differenze funzionali in questo caso. 'Buffer.BlockCopy' è un po 'più restrittivo - sospetto che sia implementato in un modo di livello inferiore, ma non conosco i dettagli. –
Si potrebbe fare questo:
using System.Linq
// ...
var newArray = oldArray.Skip(numBytes).ToArray();
Se non è possibile utilizzare LINQ, si poteva fare in questo modo:
byte[] myArray = // however you acquire the array
byte[] newArray = new byte[myArray.Length - 16];
for (int i = 0; i < newArray.Length; i++)
{
newArray[i] = myArray[i + 16];
}
// newArray is now myArray minus the first 16 bytes
Avrete anche bisogno per gestire il caso in cui la matrice è lungo meno di 16 byte.
Vorrei anche ricordare - a seconda di come si prevede di utilizzare i risultati, spesso, un approccio alternativo è quello di utilizzare ArraySegment<T>
per accedere alla porzione restante dell'array. Ciò impedisce la necessità di copiare l'array, che può essere più efficiente in alcuni scenari di utilizzo:
ArraySegment<byte> segment = new ArraySegment<byte>(originalArray, 16, originalArray.Length-16);
// Use segment how you'd use your array...
- 1. Rimozione dei primi 16 byte da un array di byte
- 2. android cipher non decrittografa i primi 16 byte/caratteri di dati crittografati
- 3. Leggere i primi byte di un file
- 4. CipherInputStream letto solo 16 byte (AES/Java)
- 5. Download dei primi 1000 byte
- 6. Crittografia AES di 16 byte senza sale
- 7. Come mostrare i primi x byte usando hexdump?
- 8. Leggere solo i primi N byte dal socket in node.js
- 9. Meta tag non nei primi 1024 byte
- 10. Come rimuovere i primi tre caratteri dalla stringa con C?
- 11. Rimuovere i primi 3 caratteri in var nel file batch?
- 12. come rimuovere i primi 3 caratteri da nsstring?
- 13. MySQL Rimuovere primi due caratteri di tutti i campi
- 14. Come rimuovere i primi 10 caratteri da una stringa?
- 15. Come posso decodificare i dati UTF-16 in Perl quando non conosco l'ordine dei byte?
- 16. PySerial: danneggiamento dei dati nei primi 256 byte
- 17. node.js/leggi 100 primi byte di un file
- 18. Cosa allineamento al limite di 16 byte significa in x86
- 19. Come allocare memoria con un allineamento di 16 byte?
- 20. Perché struct è migliore con meno di 16 byte
- 21. Converti int con firma a 16 bit a 2 byte?
- 22. come convertire due byte in un numero a 16 bit?
- 23. algoritmo di hash in C per mappa 16 byte valori a 2 byte valori
- 24. Nascondere i primi caratteri x
- 25. MATLAB: lettura di entrambi i byte di un file binario a 16 bit senza segno
- 26. Come ottenere solo i primi dieci byte di un file binario
- 27. Come correggere "Errore: un attributo charset su un meta elemento trovato dopo i primi 512 byte."
- 28. conversione utf-16 -> utf-8 E rimuovere BOM
- 29. Come rimuovere i primi due e gli ultimi due caratteri in una stringa?
- 30. Come posso rimuovere i primi caratteri X dalla stringa usando sed?
Un'altra domanda SO difettosa, ne abbiamo ricevute molte ultimamente. Distinto da una domanda a frase unica che non fa molto per spiegare il titolo. Di gran lunga l'approccio migliore è quello di non farlo.Molti metodi che accettano un array hanno un sovraccarico che richiede un offset e una lunghezza. C'è anche una classe dedicata per questo: ArraySegment. Se questo ti sarebbe di aiuto non è chiaro dalla tua domanda. Probabilmente no. –