byte[] a = {1,2,3,0,1,2,3,0,0,0,0,4};
String s0 = new String(a, "ISO-8859-1");
String s1 = s0.replaceAll("\\x00{4,}", "");
byte[] r = s1.getBytes("ISO-8859-1");
System.out.println(Arrays.toString(r)); // [1, 2, 3, 0, 1, 2, 3, 4]
tôi sử dụng tiêu chuẩn ISO-8859-1 (latin1) bởi vì, không giống như bất kỳ mã hóa khác,
mỗi byte trong phạm vi 0x00..0xFF
bản đồ để một nhân vật có giá trị, và
mỗi các ký tự đó có cùng giá trị số như mã hóa latin1 của nó.
đó có nghĩa là chuỗi là chiều dài tương tự như mảng byte gốc, bạn có thể phù hợp với bất kỳ byte bởi giá trị số của nó với \xFF
xây dựng, và bạn có thể chuyển đổi chuỗi kết quả trở lại một mảng byte mà không làm mất thông tin .
Tôi sẽ không cố hiển thị hiển thị dữ liệu khi ở dạng chuỗi - mặc dù tất cả các ký tự hợp lệ, nhiều ký tự không thể in được. Ngoài ra, tránh thao tác dữ liệu trong khi nó ở dạng chuỗi; bạn có thể vô tình thực hiện một số thay thế chuỗi thoát hoặc một chuyển đổi mã hóa khác mà không nhận ra nó. Trong thực tế, tôi sẽ không khuyên bạn nên làm điều này ở tất cả, nhưng đó không phải là những gì bạn yêu cầu.:)
Ngoài ra, hãy lưu ý rằng kỹ thuật này không nhất thiết phải hoạt động ở các ngôn ngữ lập trình khác hoặc hương vị regex. Bạn sẽ phải kiểm tra từng cá nhân.
Làm thế nào quan trọng là hiệu suất và sử dụng bộ nhớ đối với trường hợp sử dụng của bạn? Nói chung, RAM rẻ và CPU nhanh. Bạn đã thực sự tìm thấy một nút cổ chai hay nó là một trường hợp đáng lo ngại về hiệu quả? Bạn có thể dễ dàng thử nó bằng cách chuyển đổi byte [] thành String bằng cách sử dụng mã hóa 8 bit, thực hiện regexing của bạn và kiểm tra hiệu suất. Sau khi tất cả, chúng tôi không lo lắng về cách các chuỗi Java không hiệu quả với các ký tự 16 bit của chúng là để sử dụng bình thường trong các môi trường ANSI, phải không? –
Đó là một ứng dụng hiệu suất cao, tôi lo lắng nhiều hơn về chu kỳ so với sử dụng ram. – Mike
Nó vẫn có giá trị điểm chuẩn; một Hotspot VM sẽ chuyển đổi mã trong các điểm nóng thành mã máy, sẽ xử lý dữ liệu 16 bit ở cùng tốc độ với dữ liệu 8 bit vì tất cả đều khớp với một từ máy 32 bit. Ngay cả khi bạn tìm thấy nó quá chậm, bạn sẽ không phải mất nhiều thời gian để tìm ra nó. –