2013-09-05 3 views
1

사람이 내가 수행하는자바 소켓의 InputStream 읽기 잘못된 데이터

  1. 클라이언트 C에서 UCHAR 배열 ++되는 화상 데이터를 보낼 것입니다이 코드를 잘못 무엇을 알 수 있습니다.
  2. Java 서버는 서버 소켓을 사용하여이 데이터를 수신하고 바이트 배열로 저장합니다. 내가 buffer에 음의 값을 얻고있다 inputstream in에서 읽는 동안 여기

은 ...

private ServerSocket serverSocket; 
    InputStream in; 
    int imageSize=300;//921600;//expected image size 640X480X3 
    public imageReciver(int port) throws IOException { 
     serverSocket = new ServerSocket(port); 
    } 


     Socket server = null; 
     server = serverSocket.accept(); 
     in = server.getInputStream(); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     byte buffer[] = new byte[100]; 

     int remainingBytes = imageSize; // 
     while (remainingBytes > 0) { 
     int bytesRead = in.read(buffer); 
     if (bytesRead < 0) { 
     throw new IOException("Unexpected end of data"); 
     } 
     baos.write(buffer, 0, bytesRead); 
     remainingBytes -= bytesRead; 
     } 
     in.close(); 

     byte imageByte[] = new byte[imageSize];   
     imageByte = baos.toByteArray(); 
     baos.close(); 

코드입니다.

+0

이미지의 크기를 확인 했습니까? – Xabster

+0

예 300 바이트를 정확히 보내고 있습니다 ... – Haris

답변

3

나는 문제가 있다고 생각한다 :

자바의 서명이되어 있고 서명되지 않은 바이트를 보내는 중이다. Java docs에서

:

바이트 : 바이트 데이터 유형은 8 비트 부호있는 2의 보수 정수입니다. 최소값은 -128이고 최대 값은 127 (포함)입니다. 바이트 데이터 형식은 메모리 절약이 실제로 중요한 부분 인 큰 배열 에 메모리를 절약하는 데 유용 할 수 있습니다. 그것들은 또한 코드의 명확성을 위해 한계가 도움이되는 int의 장소 인 에서 사용될 수 있습니다. 변수의 범위가 제한되는 사실 은 문서 형식으로 사용될 수 있습니다.

short bVal = /*signed byte*/; 
if (bVal < 0) 
    bVal = bVal + 256; //Convert to positive 

편집 : 으로는 @Aubin 지적, 짧은 더 나은 선택을 대신하는 int 될 것입니다

당신은 뭔가를 시도 할 수 있습니다.

0

부호가 있거나 서명되지 않은 데이터 표현은 인간의 관례입니다. 이 규칙은 산술 연산을 사용할 때 프로세서가 사용합니다.

여기에 해당하지 않습니다. 간단한 읽기 및 쓰기이며 비트 7이 음수 플래그로 사용되거나 효과가없는 것으로 간주됩니다.

소켓을 읽고 파일을 쓰는 작업은 바이트 버퍼를 사용하거나 ByteBuffer을 사용하는 것이 좋습니다. I suggest a buffer size of 8K.

java.nio.channels을 사용하여 코드를 다시 작성하는 것이 더 좋을 수도 있습니다.

관련 문제