Làm cách nào để loại bỏ một số byte khỏi mảng byte?Xóa 16 byte đầu tiên?
Trả lời
EDIT: Như bình luận nobugz (và câu trả lời Reed Copsey của) đề cập, nếu bạn không thực sự cần kết quả như một mảng byte, bạn nên xem xét sử dụng ArraySegment<T>
:
ArraySegment<byte> segment = new ArraySegment<byte>(full, 16, full.Length - 16);
Nếu không, sao chép sẽ cần thiết - mảng luôn có kích thước cố định, vì vậy bạn không thể "xóa" 16 byte đầu tiên khỏi mảng hiện có. Thay vào đó, bạn sẽ phải tạo một mảng mới, nhỏ hơn và sao chép dữ liệu có liên quan vào đó.
gợi ý Zach là dọc theo dòng phù hợp với cách tiếp cận phi LINQ, nhưng nó có thể được thực hiện đơn giản hơn (điều này giả định bạn đã biết các mảng ban đầu có chiều dài ít nhất là 16 byte):
byte[] newArray = new byte[oldArray.Length - 16];
Buffer.BlockCopy(oldArray, 16, newArray, 0, newArray.Length);
hoặc
byte[] newArray = new byte[oldArray.Length - 16];
Array.Copy(oldArray, 16, newArray, 0, newArray.Length);
tôi nghi ngờBuffer.BlockCopy
sẽ nhanh hơn một chút, nhưng tôi không biết chắc chắn. Lưu ý rằng cả hai cách này có thể hiệu quả hơn đáng kể so với phương pháp LINQ nếu các mảng có liên quan lớn: phương pháp LINQ yêu cầu mỗi byte được trả về riêng lẻ từ một trình lặp và các bản sao trung gian có thể được thực hiện (trong cùng một cách thêm các mục vào List<T>
cần phải phát triển mảng sao lưu theo định kỳ). Rõ ràng là không tối ưu hóa vi mô, nhưng nó có giá trị kiểm tra nếu bit mã này là một nút cổ chai hiệu suất.
EDIT: Tôi đã chạy một điểm chuẩn "nhanh chóng và bẩn" của ba phương pháp tiếp cận. Tôi không tin tưởng điểm chuẩn để phân biệt giữa Buffer.BlockCopy
và Array.Copy
- chúng khá gần - nhưng cách tiếp cận LINQ chậm hơn 100 lần.
Trên máy tính xách tay của tôi, sử dụng mảng byte 10.000 phần tử, mất gần 10 giây để thực hiện 40.000 bản sao bằng LINQ; các phương pháp trên mất khoảng 80ms để thực hiện cùng một lượng công việc. Tôi tăng số lần lặp lên 4.000.000 và nó vẫn chỉ mất khoảng 7 giây. Rõ ràng là những lời khuyên thông thường xung quanh các tiêu chí vi chuẩn được áp dụng, nhưng đây là một sự khác biệt khá có ý nghĩa.
Chắc chắn sử dụng phương pháp trên nếu điều này là trong một con đường mã đó là quan trọng đối với hiệu suất :)
+1, bộ đệm chắc chắn hiệu quả hơn đối với mảng lớn. –
Sự khác biệt giữa Buffer.BlockCopy và Array.Copy khi được sử dụng với mảng byte là gì? – dtb
@dtb: Tôi không mong đợi có bất kỳ sự khác biệt chức năng nào trong trường hợp này. 'Buffer.BlockCopy' hơi hạn chế hơn một chút - tôi nghi ngờ nó được cài đặt ở mức độ thấp hơn, nhưng tôi không biết chi tiết. –
Bạn có thể làm điều này:
using System.Linq
// ...
var newArray = oldArray.Skip(numBytes).ToArray();
Nếu bạn không thể sử dụng LINQ, bạn có thể làm theo cách này:
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
Bạn cũng sẽ cần phải xử lý các trường hợp mảng dài hơn 16 byte.
tôi cũng sẽ đề cập đến - tùy thuộc vào cách bạn định sử dụng các kết quả, thường xuyên, một cách tiếp cận khác là sử dụng ArraySegment<T>
để chỉ truy cập phần còn lại của mảng. Điều này ngăn sự cần thiết phải sao chép mảng, có thể hiệu quả hơn trong một số trường hợp sử dụng:
ArraySegment<byte> segment = new ArraySegment<byte>(originalArray, 16, originalArray.Length-16);
// Use segment how you'd use your array...
- 1. Xóa 16 byte đầu tiên khỏi mảng byte
- 2. CipherInputStream chỉ đọc 16 byte (AES/Java)
- 3. Tải xuống 1000 byte đầu tiên
- 4. Xóa dòng đầu tiên jtextarea
- 5. Mã hóa AES 16 byte không có muối
- 6. xóa cam kết git đầu tiên
- 7. Python, in Hex xóa 0 đầu tiên?
- 8. Xóa ký tự đầu tiên của chuỗi
- 9. Xóa từ đầu tiên trong chuỗi Python?
- 10. Đọc các byte đầu tiên của một tệp
- 11. Cách lấy mười byte đầu tiên của tệp nhị phân
- 12. Thẻ meta không nằm trong 1024 byte đầu tiên
- 13. Thời gian để byte đầu tiên với javascript?
- 14. Đọc 16 byte nguyên tử trên CPU x64
- 15. cách chuyển đổi hai byte thành một số 16 bit?
- 16. Có thể xóa byte từ đầu tệp không?
- 17. Đầu đọc CSV UTF-16 của Python
- 18. Lấy và xóa ký tự đầu tiên của chuỗi
- 19. Mã TPT đầu tiên và thác trên xóa
- 20. Xóa mọi thứ trừ cột đầu tiên trong VIM
- 21. Xóa các mức nhận dạng đầu tiên trong mảng
- 22. C++ "xóa" chậm. Tôi nên nhìn đầu tiên ở đâu?
- 23. Xóa phần tử đầu tiên khỏi $ @ trong bash
- 24. event.preventDefault() trên nhấp chuột đầu tiên sau đó xóa
- 25. Xóa hình thức đầu tiên của từ khỏi chuỗi?
- 26. Xóa các dòng X đầu tiên khỏi một tệp PHP
- 27. Xóa phần tử kết hợp đầu tiên khỏi mảng
- 28. cách xóa 3 ký tự đầu tiên khỏi chuỗi nsstring?
- 29. Xóa từ đầu tiên khỏi chuỗi trong Java
- 30. MYSQL Xóa các bản sao đầu tiên từ bảng
Một câu hỏi SO thiếu sót khác, chúng tôi đã nhận được nhiều câu hỏi gần đây. Phân biệt bởi một câu hỏi duy nhất mà không làm gì nhiều để giải thích tiêu đề. Đến nay cách tiếp cận tốt nhất là không làm điều đó.Nhiều phương thức lấy một mảng có quá tải mất một độ dài và độ dài. Thậm chí còn có một lớp dành riêng cho nó: ArraySegment. Cho dù điều đó sẽ giúp bạn là khá rõ ràng từ câu hỏi của bạn. Chắc là không. –