Bayt dizisinden birkaç bayt kaldırmaya nasıl giderim?İlk 16 Byte Kaldır?
cevap
DÜZENLEME: nobugz en comment (ve Reed Copsey cevabı) bahseder gibi aslında bir bayt dizisi olarak sonucu gerekmiyorsa, sen ArraySegment<T>
kullanarak içine görünmelidir:
ArraySegment<byte> segment = new ArraySegment<byte>(full, 16, full.Length - 16);
, kopyalama olacak gerekli - diziler her zaman sabit bir boyuta sahip olduğundan, var olan diziden ilk 16 baytı "kaldıramazsınız". Bunun yerine, yeni, daha küçük bir dizi oluşturup ilgili verileri ona kopyalamanız gerekir.
Zach'in öneri dışı LINQ yaklaşım için doğru çizgiler boyunca, ancak (bu zaten orijinal dizi uzun, en az 16 bayt olduğunu biliyorum varsayar) daha basit hale getirilebilir:
byte[] newArray = new byte[oldArray.Length - 16];
Buffer.BlockCopy(oldArray, 16, newArray, 0, newArray.Length);
veya
byte[] newArray = new byte[oldArray.Length - 16];
Array.Copy(oldArray, 16, newArray, 0, newArray.Length);
Ben şüpheliBuffer.BlockCopy
biraz daha hızlı olacak, ama emin değiliz. İlgili dizileri büyükse, bunların her ikisi de LINQ yaklaşımından önemli ölçüde daha verimli olabilir: LINQ yaklaşımı, her baytın tek tek bir yineleyiciden döndürülmesini ve potansiyel olarak ara kopyaların yapılmasını gerektirir (aynı şekilde). List<T>
ürününe öğe eklerken, yedekleme dizisini düzenli olarak büyütmek gerekir). Açıkçası, mikro-optimize etmeyin, ancak bu kod biraz performans darboğaz ise kontrol değer.
DÜZENLEME: Üç yaklaşımın çok "hızlı ve kirli" bir karşılaştırmasını yaptım. Ben Buffer.BlockCopy
ve Array.Copy
arasındaki farkı ayırt etmek için kıyaslama yapıyorum - oldukça yakındılar - ama LINQ yaklaşımı 100 kat daha yavaştı.
Dizüstü bilgisayarımda, 10,000 öğeden oluşan bayt dizileri kullanarak, LINQ kullanarak 40.000 kopya gerçekleştirmesi yaklaşık 10 saniye sürdü; Yukarıdaki yaklaşımlar aynı miktarda işi yapmak için yaklaşık 80 ms sürdü. Yinelemeyi 4,000,000'e çıkardım ve hala sadece 7 saniye sürdü. Açıkçası, mikro kriterler etrafında normal uyarılar geçerlidir, ancak bu oldukça anlamlı bir farktır. Bu performans :) önemlidir bir kod yolu ise
Kesinlikle yukarıdaki yaklaşım kullanmak
+1, tamponlama büyük diziler için kesinlikle daha verimlidir. –
Bayt dizileriyle kullanıldığında Buffer.BlockCopy ve Array.Copy arasındaki fark nedir? – dtb
@dtb: Bu durumda herhangi bir işlevsel farklılık olmasını beklemiyorum. Buffer.BlockCopy 'biraz daha kısıtlayıcıdır - bunun daha düşük seviyeli bir şekilde uygulandığından şüpheleniyorum, ama detayları bilmiyorum. –
Bunu yapabilirsiniz: Eğer Linq kullanamıyorsanız
using System.Linq
// ...
var newArray = oldArray.Skip(numBytes).ToArray();
, bunu bu şekilde yapabilirsiniz:
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
Ayrıca olaya el gerekir nerede dizisi 16 bayttan daha azdır.
- Sonuçları kullanmayı planlıyorsanız biçimine bağlı olarak, genellikle, alternatif bir yaklaşım kullanmaktır Dizinin kalan kısmına erişmek için ArraySegment<T>
. Bu, bazı kullanım senaryolarında daha verimli olabilen dizinin kopyalanması ihtiyacını önler:
- 1. Bayt dizisinden ilk 16 bayt kaldırılıyor
- 2. Golang byte
- 3. Listeden bir sayının ilk oluşumunu kaldır
- 4. Ubuntu 16
- 5. UTF8 byte [] dize dönüşümü
- 6. Okuma ve her byte son bit ayarlanırsa ben byte bir dosya byte okumak ve kontrol etmek istiyorum Python
- 7. Git kaldır geçmişi kaldır
- 8. Android: Görünümden kaldır kaldır
- 9. Byte Buddy
- 10. Byte [] ASCII
- 11. pandalar to_csv ilk ekstra sütun kaldır, nasıl yapılır?
- 12. Xcode4 tüm çıktıları göster (kaldır "Yalnızca ilk 200 bildirimi gösterme")
- 13. SQL Server Management Studio'da ilk iletişim kutusunu kaldır
- 14. _FooBar @ 16 DLL sembolündeki 16 numara neyi temsil ediyor?
- 15. UTF-16'yı UTF-16 üzerinden kullanmanın avantajı nedir?
- 16. Java cipher.doFinal() extra byte yazıyor
- 17. Xcode değiştir/kaldır şablonunu kaldır
- 18. kaldır paketleri
- 19. Tarih formunu kaldır permalink
- 20. varchar2 (n BYTE | CHAR) varsayılan -> CHAR veya BYTE
- 21. byte [], başka bir byte [] özel konumundan kopyalamaksızın nasıl alınır?
- 22. MySQL byte-for-byte karşılaştırması daha mı hızlı? bin_collate
- 23. JavaScript dosyası byte []
- 24. Byte [] 'den XmlTextReader'a
- 25. SSE Talimatlar: Byte + Short
- 26. Desteklenen byte [] ile Float []
- 27. UIImage'ın Byte Array'e Dönüştürülmesi
- 28. kaydet Byte Dizisi
- 29. Byte dizisini ByteArrayOutputStream'e dönüştürme
- 30. Python'da Byte Array
Bir başka kusurlu SO sorusu, son zamanlarda bunlardan çok şey alıyoruz. Başlığı açıklamak için fazla bir şey yapmayan tek bir cümle sorusuyla ayırt edilir. Şimdiye kadar en iyi yaklaşım bunu yapmamaktır.Bir dizi alan birçok yöntem bir ofset ve uzunluk alan bir aşırı yüklenmeye sahiptir. Bunun için özel bir sınıf bile var: ArraySegment. Bu size yardım edip etmeyeceği sorusundan belli değil. Muhtemelen değil. –