appendData
yöntemini kullanarak bir NSMutableData örneğine kolayca bayt ekleyebilirim, ancak verileri kaldırmak için benzer bir yöntem görmüyorum? Bir şeye bakıyor muyum yoksa yeni bir nesne oluşturmam ve sadece ihtiyacım olan baytları kopyalamam mı gerekiyor? NSMutableData yanaNSMutableData baytları nasıl kaldırır?
cevap
aşağıdaki yöntemin belgelerine bakınız
kullanın ucundan 10 byte kaldırmak için:aralığının uzunluğu replacementLength eşit değilse, alıcı yeniden boyutlandırılır olduğunu yeni baytları barındırır. numaralı alıcıdaki herhangi bir bayt geçmiş aralığı, yeni bayt sayısına uyacak şekilde kaydırılır. Bu nedenle replacementBytes için NULL ve replacementLength için 0 değerini aralığında aralıktaki alıcıyı silmek için geçirebilirsiniz. Bu da ( sıfır uzunlukta olabilir) ekleme etkiye sahip aralığı uzunluğu daha byte (veya “bir yerine görür, ve daha”) bir dizi yerini alabilir.
[data setLength:[data length] - 10];
Ayrıca replaceBytesInRange aracılığıyla yapılabilir, ancak bayt gerçekten kaldırılmaz, çünkü aslında çok hızlıdır. Bunun yerine, yalnızca iç boyut değişkeni değiştirilir ve NSMutableData, baytlar kaldırılmış gibi davranır. IOW, bu bir O (1) işlemidir (bu, kaç bayttan bağımsız olarak, her zaman gerçekleştirmek için eşit uzun süre alacağı anlamına gelir) ve çok hızlıdır.
önden 10 bayt kaldırmak için kullanımı:
[data replaceBytesInRange:NSMakeRange(0, 10) withBytes:NULL length:0];
orta (örn sonra 20 bayt), kullanım içinde, 10 bayt kaldırmak için:
[data replaceBytesInRange:NSMakeRange(20, 10) withBytes:NULL length:0];
replaceBytesInRange, bir O (n) operasyonu olsa da. Bu, 100 bayt'ın kaldırılması ne kadar sürecek olursa olsun, 200 baytlık kaldırmak için iki kat daha uzun sürecek anlamına gelir. Hala oldukça hızlı ve sadece bilgisayarınızın belleği (RAM) ile sınırlı. 10 MB veriye sahipseniz ve önden 1 MB çıkarırsanız, kaldırılan MB'nin boşluğunu doldurmak için 9 MB kopyalanır. Dolayısıyla işlemin hızı, sisteminizin 9 MB RAM'i bir adresten diğerine ne kadar hızlı taşıyabileceğine bağlıdır.Ve bu yüzlerce MB içeren NSMutableData nesneleriyle uğraşmadıkça, yeterince hızlıdır.
sen CFDataDeleteBytes kullanabilirsiniz, ücretsiz CFMutableDataRef ile köprülü() fonksiyonu: Kaldırmak istediğiniz veri sonunda ise
NSMutableData *data = ...
CFDataDeleteBytes((CFMutableDataRef)data, CFRangeMake(3, 4));
Dikkatli olun. Bu yol aşağı performans sıkıntıları yatıyor. Göreceli olarak az sayıda düzenleme yapıyorsanız veya küçük bir veriyle çalışıyorsanız büyük bir sorun olmaz. Daha büyük veya sık veya performansa duyarlı herhangi bir şey, bir türün optimize edilmiş veri yapısını kullanmayı düşünün. – bbum
Teşekkürler, bu harika çalıştı. NSMutable verilerin CFMutableDataRef ile “ücretsiz köprülenmiş” olduğunu nereden biliyorsunuz? NSMutableData belgelerinde bundan hiç bahsetmiyorum? – Kyle
Eğer NSMutableData docs "Genel Bakış" bölümünde http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSMutableData_Class/Reference/NSMutableData.html bakarsanız görürsünüz İkinci paragrafta belirtilen –
, sen
[NSMutableDataInstance setLength:[NSMutableDataInstance length] - n];
kullanabilirsiniz
veya obj-c 2.0 sözdizimi ile
NSMutableDataInstance.length -= n;
Bundan daha karmaşık bir şey için ham verileri manipüle etmenizi tavsiye ederim. Aşağıdaki
- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength
Elma açıkça söylüyor:
Bahşiş için teşekkürler! Ancak önünden kaldırmaya çalışıyorum :) – Kyle
bu parçacığı cevabı var olduğunu görüyoruz, ama yine de bu değerli eklenti olabilir. NSMuttableData tüm bayt kaldırmak için, yeni veri oluşturmak ve orijinal kopyalayabilirsiniz:
[myData setData:[NSData dataWithBytes:NULL length:0]];
Bu iyi çalışıyor.
- 1. İçindekiler NSMutableData
- 2. NSMutableData to iPhone nasıl NSString dönüştürmek için?
- 3. Bir NSMutableData nesnesine ham bayt nasıl yazılır?
- 4. nsdata nesnelerini nsmutabledata nesnesine birleştirin
- 5. NSData baytları üzerinden yineleme
- 6. WebRequest GetResponseStream okuma baytları
- 7. Integers'e verimli paketleme baytları?
- 8. Rasgele baytları bir tamsayı aralığına dönüştürme - nasıl?
- 9. Java'da int için baytları dönüştürme
- 10. Jsoup özel karakterleri kaldırır
- 11. Baytları indekslediğimde neden int alırım?
- 12. "Yineleyici, dizeleri değil baytları döndürmelidir"
- 13. protokol arabellek baytları neden C++ 'da dize?
- 14. Baytları Qt kullanarak ses çıkışına yazabilir miyim?
- 15. TypeScript: derleme, ilgisiz ithalatları kaldırır
- 16. Proguard kullanılmayan kodu kaldırır (Android'de)
- 17. Neden Application.Clean() yazdırılabilir karakterleri kaldırır?
- 18. removeObserver() tüm gözlemcileri kaldırır mı?
- 19. Ham baytları ham bayt olarak al R
- 20. ASP.Net Web API'sı, StreamContent'ten tüm baytları okumaz
- 21. Python'da Baytları Kayan Nokta Sayılarına Dönüştürme
- 22. Delphi 2009, Indy 10, TIdTCPServer.OnExecute, InputBuffer'daki tüm baytları nasıl yakalayacağınız
- 23. Linux'ta ikili dosyaların ilk N baytları nasıl karşılaştırılır?
- 24. Htaccess rewrite sondaki eğik çizgileri kaldırır
- 25. Yineleyicinin kaldırma yöntemi aslında bir nesneyi kaldırır.
- 26. wxPython - GC.DrawText arka plan bitmap'ini kaldırır
- 27. Eclipse'deki bir girişi .svnignore'dan nasıl düzenler/kaldırır/kaldırırım?
- 28. GHC mümkün olduğunda polimorfik indirmeyi kaldırır mı?
- 29. javac, kodda başvurulan yöntemleri kaldırır mı?
- 30. JavaFX primaryStage windows sınırlarını kaldırır mı?
Bu, daha az upvotes ve şimdi alakasız olan bir cevabı türevi olmasına rağmen, bu harika bir cevaptır. Bunu bağımsız bir cevap yapmak için gözden geçirebilir misiniz? +1 –
@Yar: Elbette, neden olmasın. Referansı diğer cevabı kaldırdım. – Mecki
Bir şekilde bugün bu cevaba geri döndüm, "Aralığını da ekleyebildiğiniz aralığın uzunluğundan daha fazla baytla (sıfır uzunluktaki) bir aralığı da değiştirebilirsiniz. daha fazla ekle ”. Teğetsel ama ilgili. Teşekkürler! –