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

ArrayList 출력문제

0 추천
입력값 1을 Arraylist로 받아 출력하는데 49라는 값이 출력이 되네요.. 코딩은 아래와 같이했습니다.

public void run() {
            byte[] buffer = new byte[1024];
            int bytes;

            while (true) {
                try {
                    bytes = mmInStream.read(buffer);

...

 private String bytes2String(byte[] b, int count) {
            ArrayList<String> array = new ArrayList<String>();
            for (int i = 0; i < count; i++) {
                String myInt = Integer.toString((int) (b[i]));
                array.add(myInt);
            }
            return TextUtils.join("-", array);
}
탄약7 (380 포인트) 님이 2016년 7월 25일 질문

2개의 답변

+1 추천
 
채택된 답변

 

Array0 메소드와

제가 추가한 ArrayTest 메소드를 비교해보세요.

답이 나올겁니다.

모나미153 (17,540 포인트) 님이 2016년 7월 25일 답변
탄약7님이 2016년 7월 26일 채택됨
오... 직접 예제까지 적어주시고 감사드립니다!!

제가 array0 으로 메소드 이름을 정해준게
배열의 0번째 값만을 받아 MainActivity에 출력하기 위해서였습니다.

그런데 추가해주신 ArrayTest로 데이터를 받을 경우 배열 전체를 받기때문에
MainActivity에서 0번째 값만 불러오는 방법을 몰라서 또 문제가 있네요..ㅠ

만약 ArrayTest로 데이터를 받을경우 MainActivity에서 arraylist.get(0)으로
출력을 하면되나요?

현재는 BTService클래스 에서 블루투스로 데이터를 받아 input.putExtra("signal0"), Array0(buffer,1));
의 형태로 Receive클래스로 보내준 다음 이곳에서
intent.putExtra("temp0", $intent.getStringExtra("signal0"));
의 형태로 MainActivity로 보내줍니다
MainActivity에서는 btn_01.setText($intent.getStringExtra("temp0")의 형태로 출력하고 있구요..

신경써주셔서 감사합니다!
array.get(0)이라고 한건
순수 java에 TextUtil이 없기 때문에 저렇게 한겁니다.
그냥 기존에 TextUtil.join 쓰셔도 상관없어요.
달라진 건 (int) b[] 부분이 new String(b) 가 된겁니다.
(int)b[i] 부분을 new String(b)로 바꾸면 제가 원하는
i번째의 값을 불러오지 못하는거 아닌가요??
아니면 잘 설명해 주신건데 제가 못 알아 들은건가요?

혹시 new String(b)로 데이터를 받고 브로드캐스트 통해
데이터를 전달할때 arraylist.get("원하는 index값")을 넣어줘도 되나요?
private String bytes2String(byte[] b, int count) {
            ArrayList<String> array = new ArrayList<String>();
            for (int i = 0; i < count; i++) {
                String myInt = Integer.toString((int) (b[i]));
                array.add(myInt);
            }
            return TextUtils.join("-", array);
}
이 코드가 원본이죠?

여기서 문제는 String myInt = Integer.toString((int) (b[i])); 이 부분입니다.
현재  i == 0 일때 b[i]는 byte값 49가 들어있어요. 이거를 (int)로 형변환을 해버리니 그냥 49가 되는겁니다. 그걸 toString 하니 "49" 가 되는거구요.
바이트 배열 인덱스가 하나의 문자라면
String myInt = new String(b[i]); 이렇게 하세요.
저도 String myInt = new String(b[i])로 해보면 어떨까해서

시도를 해봤었는데 위에 byte[] buffer = new byte[1024]가 있고

bytes2String에 byte[] b로 지정해줘서 b[i]가 못들어가더라구요

input.putExtra("signal",bytes2String(buffer, bytes));로

sendBroadcast를 해야하는데..

시간이없어서 괜히 마음만 급하네요..
이상하네요 안될게 없어보이는데..
String myInt = Integer.toString((int) (b[i])); 이 코드가 되면
String myInt = new String(b[i]) 이 코드도 문제될건 없어요.
구체적으로 어떤걸 하시려는지..
String myInt = Integer.toString((int) (b[i])); 이 코드는 되는데
String myInt = new String(b[i]); 이 코드는
cannot resolve constructor 'String(byte)'라고 뜨네요..

제가 하려고 하는건 위에도 말씀드렸듯이 블루투스로 배열데이터를 받아
MainActivity에 있는 12개의 버튼에 0번째값은 1번 버튼에, 1번째값은 2번 버튼에
텍스트를 표시하고 싶은겁니다..
앗.. 그렇군요
그럼 byte[]를 받으신걸로 보아서
1 byte = 1 char인가요?
그럼 String대신 char를 쓰는것도 방법인것 같은데요..
private Character bytes2String(byte[] b, int count) {
            ArrayList<Character> array = new ArrayList<Character>();
            for (int i = 0; i < count; i++) {
                char myInt = new char(b[i]);
                array.add(myInt);
            }
            return array.get(0);
}

를 이렇게 바꾸라는 말씀이시죠? 근데 이것도 not a statement 라고 뜨네요..

일단 점심 먹고와서 다시해봐야겠어요! 점심 맛있게드세요!
1바이트가 1String과 무조건 1:1 대응이라면

    private static String ArrayTest(byte[] b, int count) {
        ArrayList<String> array = new ArrayList<String>();
        for (int i = 0; i < count; i++) {
            byte[] _b = new byte[1];
            _b[0] = b[i];
            String myInt = new String(_b);
            array.add(myInt);
        }
        return array.toString();
    }

이 코드로 가능합니다.
하지만, string같은 겨우 불가능하니
1, 2, 3, 4, 5 a, b.. 이런 문자가 아니라면 다른 방법을 찾아보셔야 할것 같네요.
//0번째 데이터 받기
private String Array0(byte[] b, int count) {
            ArrayList<String> array0 = new ArrayList<String>();
            for (int i = 0; i < 1; i++) {
                String myInt = new String(b);
                /*int mmyInt = Integer.parseInt(myInt);*/
                array0.add(myInt);

            }
            return  (new Character(array0.get(0).charAt(0))).toString();
        }

이런식으로 해서 성공했습니다!! 감사합니다!!

그런데 Array를 12개 만들어서 받자니 또 신경이 쓰이네요..
이건 어쩔수없겠죠?? 지금까지 답변 정말 감사드립니다! 추천 더 드리고싶은뎁..
0 추천
http://shaeod.tistory.com/228 를 참조해보시면 '1'에 대한 아스키코드값이 49입니다.

변환 과정에서 빠진거나 잘못된 부분이 있는게 아닐까요?
모나미153 (17,540 포인트) 님이 2016년 7월 25일 답변
ArrayList<String>이 문제 같아서

private String Array0(byte[] b, int count) {
            ArrayList<Integer> array = new ArrayList<Integer>();
            for (int i = 0; i < 1; i++) {
                String myInt = Integer.toString((int) (b[i]));
                int mmyInt = Integer.parseInt(myInt);
                array.add(mmyInt);
            }
            return TextUtils.join("-", array);
}

이렇게 바꿨는데도 49로 뜨네요..

현재 오픈소스 수정해서 사용하는거라 궁금한게 있는데

String myInt = Integer.toString((int) (b[i])); 이 부분이

문자열로 변경하는게 맞는거죠? myInt라고 해논게 햇갈려서..

그리고 맞다면 toString((int) (b[i])가 무엇을 뜻하는거죠?
보통 toString(매개변수)를 넣는데..

아는게없어서 이것저것 물어보는게 많네요.. 도움 부탁드립니다 감사합니다!
b[i]에는 byte값의 '1'이 들어있겠죠?
이거를 그냥 (int)로 바꿔버리면 당연히 49가 리턴되는게 맞습니다.
...