2011-04-16 83 views
50

我有兩個字節數組,我想知道如何去添加一個到另一個或組合它們以形成一個新的字節數組。如何結合兩個字節數組

+0

如果你添加它們,那麼你將如何處理溢出? – maerics 2011-04-16 00:05:30

+0

你是什麼意思溢出? – novicePrgrmr 2011-04-16 00:06:43

+0

你在哪裏做任何補充? – 2011-04-16 00:07:08

回答

89

你只是想連接兩個字節數組?

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]; 
} 

或者你可以使用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); 

或者你可以只用一個列表做的工作:

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

或者您可以使用System.arraycopy() – 2011-04-16 00:42:34

+1

良好的調用。我從來沒有見過'System.arraycopy();' – pickypg 2011-04-16 00:48:18

+0

並且我個人總是使用System.arraycopy,通常使用包裝器方法來處理常見的情況......實際上我早已寫了一個'ArrayUtil.resize'方法。 – 2011-04-16 00:50:07

2

假設您的byteData陣列比32 + byteSalt.length()更大......您將選擇它的長度,而不是byteSalt.length。您正在嘗試從數組末尾進行復制。

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

與您的代碼這裏的問題是用於索引數組的變量i將通過byteSalt數組和byteData數組。因此,確保byteData的尺寸是至少passwordSalt字符串的最大長度加上32.什麼會糾正它替換以下行:

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

有:

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

你可以使用Apace common lang包(org.apache.commons.lang.ArrayUtils類)執行此操作。你需要做的

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

它快嗎。我需要一個非常快速的方法。沒有循環的開銷。 – 2014-10-01 05:26:45

+1

您對開銷的恐懼讓我覺得,當您執行此循環時,您的UI會受到凍結的困擾。也許你應該考慮一個'AsyncTask'(android),這是阻止循環中斷你的UI線程的唯一方法。 – 1owk3y 2015-07-27 13:14:16

1

我用這個代碼工作的很好只是appendData,要麼通過一個字節一個數組,或者兩個數組把它們結合在一起的情況如下:

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

我認爲這是最好的辦法,

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; 
}