2011-04-16 75 views
50

Tôi có hai mảng byte và tôi tự hỏi làm thế nào tôi sẽ đi về việc thêm một đến khác hoặc kết hợp chúng để tạo thành một mảng byte mới.Làm thế nào để kết hợp hai mảng byte

+0

Nếu bạn thêm chúng thì bạn sẽ đối phó với tình trạng tràn như thế nào? – maerics

+0

tràn ngập ý nghĩa của bạn là gì? – novicePrgrmr

+0

Bạn đang làm gì thêm? –

Trả lời

89

Bạn đang cố gắng ghép nối hai mảng byte?

byte[] one = getBytesForOne(); 
byte[] two = getBytesForTwo(); 
byte[] combined = new byte[one.length + two.length]; 

for (int i = 0; i < combined.length; ++i) 
{ 
    combined[i] = i < one.length ? one[i] : two[i - one.length]; 
} 

Hoặc bạn có thể sử dụng System.arraycopy:

byte[] one = getBytesForOne(); 
byte[] two = getBytesForTwo(); 
byte[] combined = new byte[one.length + two.length]; 

System.arraycopy(one,0,combined,0   ,one.length); 
System.arraycopy(two,0,combined,one.length,two.length); 

Hoặc bạn chỉ có thể sử dụng một danh sách để làm việc:

byte[] one = getBytesForOne(); 
byte[] two = getBytesForTwo(); 

List<Byte> list = new ArrayList<Byte>(Arrays.<Byte>asList(one)); 
list.addAll(Arrays.<Byte>asList(two)); 

byte[] combined = list.toArray(new byte[list.size()]); 
+6

Hoặc bạn có thể sử dụng System.arraycopy() –

+1

Cuộc gọi tốt. Tôi không bao giờ nhìn thấy 'System.arraycopy(); ' – pickypg

+0

Và cá nhân, tôi luôn sử dụng System.arraycopy, thường với các phương thức wrapper cho trường hợp phổ biến ... thực ra tôi đã viết từ lâu một phương thức' ArrayUtil.resize'. –

2

Giả sử mảng byteData của bạn lớn hơn 32 + byteSalt.length() ... bạn sẽ có chiều dài không phải là byteSalt.length. Bạn đang cố gắng sao chép từ ngoài phần cuối mảng.

2
String temp = passwordSalt; 
byte[] byteSalt = temp.getBytes(); 
int start = 32; 
for (int i = 0; i < byteData.length; i ++) 
{ 
    byteData[start + i] = byteSalt[i]; 
} 

Vấn đề với mã của bạn ở đây là biến i đang được sử dụng để lập chỉ mục các mảng sẽ đi qua cả mảng byteSalt và mảng byteData. Vì vậy, Hãy chắc chắn rằng byteData được kích thước để có ít nhất chiều dài tối đa của chuỗi passwordSalt cộng 32. Điều gì sẽ sửa nó được thay thế dòng sau:

for (int i = 0; i < byteData.length; i ++) 

với:

for (int i = 0; i < byteSalt.length; i ++) 
17

Bạn có thể làm điều này bằng cách sử dụng gói ngôn ngữ chung Apace (org.apache.commons.lang.ArrayUtils lớp). Bạn cần phải làm những điều sau đây

byte[] concatBytes = ArrayUtils.addAll(one,two); 
+0

Có nhanh không. Tôi cần một phương pháp thực sự nhanh. Không có phí vòng lặp. –

+1

Nỗi sợ hãi của bạn về overheads làm cho tôi nghĩ rằng bạn đang gặp rắc rối bởi đóng băng giao diện người dùng của bạn bất cứ khi nào bạn thực hiện vòng lặp này. Có lẽ bạn nên xem xét một 'AsyncTask' (android), đó là cách duy nhất để ngăn chặn một vòng lặp làm gián đoạn chuỗi giao diện người dùng của bạn. – 1owk3y

1

Tôi đã sử dụng mã này mà hoạt động khá tốt chỉ appendData và một trong hai vượt qua một byte duy nhất với một mảng, hoặc hai mảng để kết hợp chúng:

protected byte[] appendData(byte firstObject,byte[] secondObject){ 
    byte[] byteArray= {firstObject}; 
    return appendData(byteArray,secondObject); 
} 

protected byte[] appendData(byte[] firstObject,byte secondByte){ 
    byte[] byteArray= {secondByte}; 
    return appendData(firstObject,byteArray); 
} 

protected byte[] appendData(byte[] firstObject,byte[] secondObject){ 
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
    try { 
     if (firstObject!=null && firstObject.length!=0) 
      outputStream.write(firstObject); 
     if (secondObject!=null && secondObject.length!=0) 
      outputStream.write(secondObject); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return outputStream.toByteArray(); 
} 
2

Tôi nghĩ rằng đó là cách tiếp cận tốt nhất,

public static byte[] addAll(final byte[] array1, byte[] array2) { 
    byte[] joinedArray = Arrays.copyOf(array1, array1.length + array2.length); 
    System.arraycopy(array2, 0, joinedArray, array1.length, array2.length); 
    return joinedArray; 
} 
Các vấn đề liên quan