2013-11-03 4 views
0

인터넷을 통해 데이터를 수신해야하는 프로그램을 만들고 있습니다. 그것은 DatagramSockets과 DatagramPackets을 사용하여 그렇게합니다. 이 모든 잘 작동하고 바이트 배열은 내가 기대하는 정확한 것입니다.NumberFormatException 유효한 숫자 문자열

그러나 바이트 배열을 문자열로 변환하고 정수로 변환하려고하면 매우 이상한 일이 발생합니다. 이 문자열 "74185, 난이 data의 내용을 검사 할 때

String length = new String(data, 1, data.length-1); 
System.out.println("length = "+length); 
size = Integer.parseInt(length); 
System.out.println("size = "+size); 

그러나, 나는 그냥 55,52,49,56,53,0,0,0,0,0,0,0,0,0,0,0,0 포함되어 있음을 볼 수, 괜찮 : 아래의 코드를 실행

parseInt 라인에 NumberFormatException이 있습니다 ". 이 예외를 throw합니다.

length 문자열로 "74185"를 하드 코딩하면 모든 것이 잘 작동합니다.

무엇이 잘못 될 수 있습니까?

+0

네트워크에서 읽은 바이트 수에주의를 기울이고 있습니까? 명시 적 인코딩을 String 생성자에 전달하는 것을 고려 했습니까? 한 칸씩 한 줄씩 16 진수로 띄워 봤습니까? – bmargulies

답변

5

문자열에 \0 문자가 포함되어 있습니다. Java에서 이들은 C가 아닌 문자열의 일부입니다.

문자열에서 \0의 첫 번째 항목을 먼저 찾은 다음 해당 부분 문자열을 가져와야합니다.

-1

생성자를 잘못 사용하여 실패합니다. String(byte\[\],index,length)입니다. 첫 번째 매개 변수 data이 맞습니다. 두 번째 배열은 0이어야하며 배열의 시작은 0입니다. 세 번째는 data.length입니다.

대신 전체 배열을 사용하려면 new String(data)을 사용할 수 있습니다.

EDIT : Roland Illig이 지적한 것처럼 배열에 숫자가 누락 된 \0자를 포함하고 있습니다. 호출하기 전에 \0을 제거하거나 먼저 \0의 인덱스를 확인하고 위의 생성자 +1의 세 번째 매개 변수로 사용해야합니다.

숫자를 보내려는 경우 구문 분석해야하는 문자열 대신 번호를 보내지 않는 이유는 무엇입니까?

+1

문자열에는 여전히 '\ 0'문자가 포함되므로 작동하지 않습니다. –