마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

자바 문법, 안드로이드 문법 질문이요

0 추천

temp132에 데이터를 바이트로 바꾸는 과정 중에요..

buffer = stream.toByteArray(); 이 부분에서 buffer를 계속 대입하고 싶은데 어떻게 하면 좋을까요??

C언어의 경우는 buffer +=  data; 이렇게 하면 되는데

자바쪽은 잘 모르겠네요 ㅜㅜ

String[] temp132 = data.split(" "); 
//output2.append("test : " + data+"\n");
ByteArrayOutputStream stream = new ByteArrayOutputStream();

for (int i = 0; i < temp132.length; i++) {
   try {
      stream.write(temp132[i].getBytes());
   } catch (IOException e) {
      e.printStackTrace();
   }
   buffer = stream.toByteArray();
}

 

 

------------------------------------------8월 2일 추가 내용 -----------------------------------------

제가 사실은 이미지 송수신 부분을 하고 있는데요.. 일부 코드가 어떻게 해야할지 몰라서 질문 드렸었습니다. ㅠㅠ 그런데 다시 코드 부분을 수정하였는데요.. 일단 구성 자체가 임베디드에서 이미지 데이터를 16 byte 씩 전송하고, 스마트폰에 그 이미지를 뿌려주려고 하는데요..

 

1. 이 부분은 임베디드(송신) 부분의 일부 코드이구요..

설명 : 임베디드에 캡처한 이미지를 불러와 fread(buf, 1, 16, file) 16 byte씩 불러와 sprint에서 byte -> int > string인 str1에 문자열로 넣게 됩니다. (str1, "I %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d \n", %d가 16개에요, buf에 들어있는 byte 변수를 %d로 정수형 입력한 후 str1 에 넣습니다. 이 때 앞에 I는 제가 이미지 뿐만 아니라 다른 데이터도 전송하고 있어서 이미지 데이터인 것을 if 로 분류하려고 전송하였습니다),  라인 10에 fsize4는 String 으로 변환했기 때문에 strlen을 사용하여 길이를 대입하였어요. 라인 7에 fpsize를 사용하면 데이터가 짤리더라구요..  그래서 이렇게 이미지 데이터가 끝날때까지 이미지 데이터를 전송하도록 구현하였어요.

 

line      code 

1.        printf("file size [%d]\n", fsize);
2.        fsize2 = htonl(fsize);
3.        printf("file size [%d] \n", fsize2);
4.        fclose(camera);
5.
6.        while(nsize != fsize){
7.                fpsize = fread(buf, 1, 16, file);
8.                nsize = nsize + fpsize;
9.                sprintf(str1, "I %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d \n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]);
10.                fsize4 = strlen(str1);
11.                send(connSock[0], str1, fsize4, 0);
12.        }

 

 

2. 안드로이드(수신) 부분, 이미지 출력

- 2.1 일단, 이 부분이 수신되는 부분 입니다.

BufferedReader를 사용해서 데이터를 받고 있는데, String 으로 밖에 받아지지 않더군요 ㅠㅠㅠ 일단 이렇게 구성하여 data = socket_in.readLine(); 여기 data 에 전송받은 데이터를 넣었습니다.

String data = "";

....

socket_in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
....
        final Thread mCheckRecv = new Thread(){
            public void run(){
                try {
                    while (true) {
                        data = socket_in.readLine();
                        Recv.sendEmptyMessage(0);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };

 

- 2.2 여기서 이미지 데이터를 분류하려고 해요 

아까 수신받은 데이터를 data에 있는 것을 String[] temp132 = data.split(" "); 을 통해 데이터를 나눕니다. ("I %d %d %d %d...",,,  %d와 %d 사이에 " "를 구분해서 temp132에 넣고, for문에서 temp132[0]에 "I" 가 있기 때문에 I를 제외하고 변환해야하기 때문에 for문에 imct = 1 부터 시작하였구요, (temp132.length)-1)는 I를 포함한 temp132.lenth가 17이기 때문에 -1을 해줘서 16을 만들어 주었습니다. 이때 temp132는 String 이기 때문에 Integer.parseInt(temp132[imct]); 를 통해 정수로 바꾸어 yyy에 넣고 yyy를 강제 변환한 후 buffer 바이트 배열에 넣어주었습니다.

 

int yyy=0;

int count10 =0;

Byte buffer[] = new Buffer[8000000];

....

final Handler Recv = new Handler() {
   public void handleMessage(Message msg) {
    updataThread();
   }

   private void updataThread() {

    String[] temp132 = data.split(" ");

    if(temp132[0].equals("I")) {
     for(int imct=1; imct<=((temp132.length)-1); imct++){
      yyy = Integer.parseInt(temp132[imct]);
      output2.append("yyy : " + yyy);
      buffer[count10] = (byte)yyy;
      ++count10;
     }
    }

 

- 2.3 마지막으로 버튼을 통해 이미지 출력부분입니다 

단순히 이미지 전송이 끝나면 완료가 된 데이터를  BitmapFactory.decodeByteArray(buffer, 0, buffer.length); 를 통해 이미지 출력합니다.

 

   Button btn4 = (Button) findViewById(R.id.img);
  btn4.setOnClickListener(new OnClickListener() {
   public void onClick(View v) {
    Bitmap bitmap = BitmapFactory.decodeByteArray(buffer, 0, buffer.length);
    image.setImageBitmap(bitmap);

   }
  });

 

근데 출력이 되지 않아요...ㅠㅠ 뭐가 잘못된지 모르겠어요...ㅠㅠ

라즈베리파이 (340 포인트) 님이 2016년 7월 29일 질문
라즈베리파이님이 2016년 8월 2일 수정

1개의 답변

0 추천
String 배열에 담겨있는거를 byte[]에 담기만 하면 되는거죠??

어떤 용도인지 모르겠지만 결과만 보면 아래처럼 하면 원하시는 결과가 나올겁니다.

 

String[] temp132 = new String[]{"aaa","bbb","ccc"};
  
  int nBufferCnt = 0;
  byte[] buffer = null;
  
  try{
   PipedInputStream pis = new PipedInputStream();
   PipedOutputStream pos = new PipedOutputStream(pis);

 

 

   
   for(String item : temp132){
    byte[] itemBinary = item.getBytes();
    nBufferCnt += itemBinary.length;
    pos.write(itemBinary , 0, itemBinary.length);
   }
   
   buffer = new byte[nBufferCnt];
   pis.read(buffer, 0, buffer.length);
   
  }catch(Exception e){
   
  }

 

근데 어떤 용도이신지 알려주시면 더 좋은 방법이 있을 수도 있으니 용도도 적어주시기 바랍니다.
Development Guy (70,570 포인트) 님이 2016년 8월 2일 답변
아 감사합니다.ㅠㅠ
저 궁극적으로 제가 하려던 부분을 본문에 추가 수정하였는데요
한번 봐주실수 있을지요 ㅜ
제가 알기로는 string 으로 보내고 받는거 보다 바이너리 형태로 프로토콜 정의해서 통신하는것이 좋을거 같습니다.

예를 들어 이미지 사이즈가 각각 100byte, 200byte, 300byte 3개라고 한다면
앞에 4byte씩 Integer값의 바이너리로 변환 하여
| 4byte | 100byte | 4byte | 200byte | 4byte | 300byte |

이런식으로 한다면
수신하는 쪽에서 각각 앞에 4byte를 읽어서 뒤의 오는 payload의 사이즈를 알수 있어서 굳이 split를 사용하여 자른다음에 바이너리로 변환하는 작업을 안넣어도 될텐데요.

그리고 참고로 각 payload의 사이즈인 integer를 4byte 바이너리로 변환할때 byteOrder 확인 하셔야 합니다. 임베디드 환경이 어떤 환경인지는 몰라도 예전에 제 경험상으로 통신상에서 원래 일반적으로는 BigEndian인데 LittleEndian으로 들어와서 변환해줘야 했던 기억이 나네요.
늦어서 죄송합니다.;;
그런 방법이 있군요! 제가 이미지쪽은 잘 몰라서 한참걸리네요 ㅠㅠ
참고하겠습니다.
정말 감사합니다.
...