Programing

2 바이트 배열을 결합하는 방법

crosscheck 2020. 12. 11. 07:49
반응형

2 바이트 배열을 결합하는 방법


이 질문에 이미 답변이 있습니다.

2 바이트 배열이 있는데 하나를 다른 배열에 추가하거나 결합하여 새 바이트 배열을 형성하는 방법에 대해 궁금합니다.


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

또는 다음을 사용할 수 있습니다 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);

또는 a List사용 하여 작업을 수행 할 수 있습니다.

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()]);

또는 단순히 ByteBuffer많은 어레이를 추가하는 이점으로 사용할 수 있습니다.

byte[] allByteArray = new byte[one.length + two.length + three.length];

ByteBuffer buff = ByteBuffer.wrap(allByteArray);
buff.put(one);
buff.put(two);
buff.put(three);

byte[] combined = buff.array();

Apace 공통 lang 패키지 ( org.apache.commons.lang.ArrayUtilsclass) 를 사용하여이를 수행 할 수 있습니다 . 다음을 수행해야합니다.

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

최선의 접근이라고 생각합니다.

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

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 ++)

byteData배열이 더 크다고 가정하면 32 + byteSalt.length()... 길이가 아니라 byteSalt.length. 배열 끝 너머에서 복사하려고합니다.


나는 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();
}

간단한 방법 (인라인, 가정 ab주어진 두 배열이다)

byte[] c = (new String(a, cch) + new String(b, cch)).getBytes(cch);

This, of course, works with more than two summands and uses a concatenation charset, defined somewhere in your code:

static final java.nio.charset.Charset cch = java.nio.charset.StandardCharsets.ISO_8859_1;

Or, in more simple form, without this charset:

byte[] c = (new String(a, "l1") + new String(b, "l1")).getBytes("l1");

But you need to suppress UnsupportedEncodingException which is unlikely to be thrown.


The fastest method:

public static byte[] concat(byte[] a, byte[] b) {
    int lenA = a.length;
    int lenB = b.length;
    byte[] c = Arrays.copyOf(a, lenA + lenB);
    System.arraycopy(b, 0, c, lenA, lenB);
    return c;
}

참고URL : https://stackoverflow.com/questions/5683486/how-to-combine-two-byte-arrays

반응형