2010-02-12 39 views
25

Có thể nhận các byte cụ thể từ một mảng byte trong java không?Tách mảng Byte

Tôi có một mảng byte:

byte[] abc = new byte[512]; 

và tôi muốn có 3 mảng byte khác nhau từ mảng này.

  1. byte 0-127
  2. byte 128-255
  3. byte256-511.

Tôi đã thử abc.read(byte[], offset,length) nhưng nó chỉ hoạt động nếu tôi bù đắp bằng 0, cho bất kỳ giá trị nào khác mà nó ném một ngoại lệ IndexOutOfbounds.

Tôi đang làm gì sai?

+0

Giá trị bù trừ tại mảng đích, không phải là giá trị nguồn. – charlie

Trả lời

58

Bạn có thể sử dụng Arrays.copyOfRange() cho điều đó.

+4

Whoa. Không biết về điều đó. –

+0

@ Jonathan Feinberg: Tính năng mới trong Java 6. – Powerlord

+0

Cảm ơn bạn rất nhiều. Điều này làm việc mà không có bất kỳ lỗi nào !!! –

12

Arrays.copyOfRange() được giới thiệu trong Java 1.6. Nếu bạn có phiên bản cũ hơn, nó được sử dụng trong nội bộ System.arraycopy(...). Dưới đây là cách triển khai:

public static <U> U[] copyOfRange(U[] original, int from, int to) { 
    Class<? extends U[]> newType = (Class<? extends U[]>) original.getClass(); 
    int newLength = to - from; 
    if (newLength < 0) { 
     throw new IllegalArgumentException(from + " > " + to); 
    } 
    U[] copy = ((Object) newType == (Object)Object[].class) 
     ? (U[]) new Object[newLength] 
     : (U[]) Array.newInstance(newType.getComponentType(), newLength); 
    System.arraycopy(original, from, copy, 0, 
        Math.min(original.length - from, newLength)); 
    return copy; 
} 
+0

-1 điều này không giống như phiên bản tiêu chuẩn. Nó không an toàn kiểu (bạn có thể chuyển nó thành một 'Integer []' và gán kết quả cho một biến 'String []'.) 'Arrays.copyOfRange (T [], int, int)' trả về 'T [] '. Bạn có thể trộn nó với phiên bản khác mà lấy một đối số 'Lớp '. – finnw

+1

@finnw: phương pháp khác chỉ bị quá tải. Tôi đã hợp nhất chúng nhưng quên loại bỏ tham số kiểu thứ 2. Bây giờ nó đã được sửa. – Bozho

1

Bạn cũng có thể sử dụng bộ đệm byte làm chế độ xem ở trên cùng của mảng ban đầu.