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

Hex값을 ByteArray에 넣는 작업인데 NumberFormatException이 납니다... 왜그럴까요??

0 추천
StringTokenizer stok = new StringTokenizer(stringToHex(sWifiSsid));                         //String -> hex 문자열 얻기 후, 문자열 쪼갠다
int nSsidSize = stok.countTokens();
byte btSsid[] = new byte[nSsidSize];                                                        //) 0x53 0x48 0x49 0x4E 0x41 0x5F 0x4C 0x41 0x42  :String
int k = 0;
while (stok.hasMoreTokens()) {

    try {
        btSsid[k] = Byte.valueOf(stok.nextToken(), 16);                                       //문자열 쪼개서 타입캐스트 후 byte배열에 넣기
    } catch (NumberFormatException nfe) {
        btSsid[k] = 0x00;
        nfe.printStackTrace();
    }
    k++;
}

 

StringTokenizer 생성자에 들어가는 파라미터는

31 5F C5 48 B1 55 D5 58 C1 38 C6 94 5F 77 6B 77 6B 

이 데이터입니다.

HexString값이어서 

하나씩 읽어오면서 Byte 16진수 처리하여 ByteArray에 넣는 방식인데

어떨 땐 잘 되고, 어떨 땐 안됩니다.

모두 ByteArray에 잘 들어가야하는데 

뭐가 잘못된걸까요??

도무지 가늠이 안서네요..

 

 

zenojm (2,840 포인트) 님이 2018년 2월 28일 질문

1개의 답변

+1 추천
 
채택된 답변

이 증상은 byte 값의 범위가 -128(0x80) ~ 127(0x7F) 라서 발생합니다. 그래서 0x80 이상의 스트링 값은 NumberFormatException이 발생합니다.예를 들어 0x80을 128로 넣으려다가 byte의 범위를 벗어나니 Exception을 발생시킵니다. Short는 2바이트라서 0x80을 128로 처리합니다. 아래와 같이 변경해 보세요.

btSsid[k] = Short.valueOf(stok.nextToken(), 16).byteValue();
리피 (750 포인트) 님이 2018년 2월 28일 답변
zenojm님이 2018년 3월 27일 채택됨
...