우선 byte[] 합치기 예제
배열을 합칠 바이트 배열을 만들고
System.arraycopy 를 이용해서 새로 만든 바이트 배열에 header 및 body 의 바이트값을 넣어준뒤 보내주면 되겠네요
아래 소스 참고해서 적용해보세요
public class test {
public static void main(String[] args) {
String body = "abcdefg";
byte [] header = {
(byte)0x00, (byte)0x00, (byte)0x4E, (byte)0x20, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x2F, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00
};
byte[] temp = body.getBytes(); // 문자열을 바이트 배열로 변환
byte[] data = new byte[temp.length + header.length]; // body와 header를 담을 바이트배열생성
System.arraycopy(header, 0, data, 0, header.length);
// data 배열의 0번째 인덱스에 header 배열의 0번째 인덱스부터 header 의 길이만큼 복사
System.arraycopy(temp, 0, data, header.length, temp.length);
// data 배열에 header.length 만큼의 인덱스에 temp 배열의 0번째 인덱스부터 body 의 길이만큼 복사
for (int i=0; i<data.length; i++)="" {<br=""> System.out.println(data[i]);
}
}</data.length;>
}
참고로 arraycopy 의 api 를 보면
arraycopy
(Object src, int srcPos, Object dest, int destPos, int length)
src - 카피할 소스
srcPos - 카피할 소스의 시작 위치, 인덱스
dest - 카피받을(?) 객체
destPos - 카피받을 시작 인덱스
int length - 카피할 길이
===========================================================
Java에서 System.arraycopy() 사용법
전체 데이터가 있을 때, 그 특정 부분만 빼오고 싶을 때가 있습니다.
데이터를 하나씩 읽어가다가 내가 찾는 번지가 나올 때부터 값을 저장하게 하고, 일정 갯수나 위치 만큼 까지만 읽어오게 한다면... 할 수 있지만, 상당히 귀찮은 일입니다.
이런 경우에 쉽게 사용할 수 있는게 System.arraycopy입니다.
배열에서 원하는 부분만 복사한다는 의미로 생각하면 됩니다.
1. System.arraycopy()
Java 코드를 주로 이클립스에서 작성을 하는데, System.arraycopy() 라고 입력을 합니다.
System.arraycopy(arg0, arg1, arg2, arg3, arg4);
예전에는 자세히 뜬거 같은데, 요즘엔 arg 라는 값만 떠서 헷갈리게 합니다.
이런 경우에는, arraycopy 부분에 마우스를 클릭하면 F2를 누르면 자세한 설명이 나옵니다.
2. System.arraycopy() 요소
Object src : 복사하고자 하는 소스입니다. 원본이라고 생각하면 됩니다.
int srcPos : 위의 소스에서 어느 부분부터 읽어올지 위치를 정해줍니다.
Object dest : 원본이 있다면 복사본이 있어야겠지요. 복사하려는 대상입니다.
int destPos : 위의 dest에서 자료를 받을 때, 어느 부분부터 쓸지 시작 위치를 정해줍니다.
int length : 원본에서 복사본까지 얼마큼 읽어 올지 입력하는 것 입니다.
간단하게 앞의 2개는 src(원본)에 관한 것이고, 그 뒤에 2개는 dest(복사본), 마지막으로 length는 가져올 길이라고 생각하면 됩니다.
3. System.arraycopy() 예제 1
사용법에 대해서 설명을 들었으니, 간단하게 예제를 들어보도록 하겠습니다.
원본 배열 이름은 src 라고 하고 복사본은 dest 라고 하겠습니다.
원본 배열은 아래와 같이 00 ~ 0F 까지 차례대로 데이터를 넣었습니다.
복사된 내용을 넣을 배열은 4 바이트 만큼 잡았습니다.
byte[] src = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 ... 0x0F }
byte[] dest = new byte[4];
이제 System.arraycopy를 사용할 차례입니다.
위에서 배운대로 먼저 배열을 넣어줍니다.
System.arraycopy(src, ?,
dest
, ?, ?);
그 다음엔 원본에 첫 번째 있는 데이터를 복사본 길이 만큼 넣어주려고 합니다.
src 다음에 0이라고 입력하여, 원본의 첫 데이터부터 복사한다고 정해줍니다.
그 다음 복사된 데이터를 dest의 첫 번째 자리부터 넣을거라고 0이라고 입력을 합니다.
System.arraycopy(src,
0
, dest,
0
, ?);
그 다음 dest 의 길이인 4 만큼 넣을 것이므로 제일 마지막엔 4 라고 입력을 해줍니다.
System.arraycopy(src, 0, dest, 0, 4);
System.arraycopy를 실행 후에, dest 의 값을 출력하도록 합니다.
아래와 같이 원본의 처음 데이터부터 4번째까지 데이터가 들어왔습니다.
dest 값
0x00, 0x01, 0x02, 0x03
3. System.arraycopy() 예제 2
이번에는 원본에서 처음이 아닌 특정 위치 데이터를 복사본의 특정 위치에 복사를 해보도록 하겠습니다.
byte[] src = { 0x01, 0x02, 0x03, 0x04, 0x05 ... 0x0F }
byte[] dest = new byte[8];
먼저 dest를 출력을 해봅니다.
선언 후에 데이터가 없기 때문에 0으로 출력이 됩니다.
dest 값
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
원본에 있는 데이터를 0x03부터 0x06 까지만 복사하고 싶습니다.
0x03 의 위치인 2를 입력합니다.
그 다음 0x03~0x06 는 갯수가 4개 이므로 4을 입력합니다.
System.arraycopy(src,
2
, dest, ?,
4
);
이번에는 dest 기준으로 0 이라고 입력하면 처음부터 복사한 데이터를 저장할 것입니다.
이번엔 4번째부터 넣을 예정이니 3이라고 입력을 합니다.
System.arraycopy(src, 2, dest,
3
, 4);
System.arraycopy를 수행한 후에 dest 값을 출력해봅니다.
아래와 같이 원하는 위치에 들어가면 문제 없이 출력이 된 것입니다.
dest 값
0x00, 0x00, 0x00, 0x03, 0x04, 0x05, 0x06, 0x00