Java Socket输入流读取错误的数据

时间:2013-09-05 06:07:27

标签: java

任何人都可以说出这段代码有什么问题,我做的是

  1. 客户端从c ++发送uchar数组的图像数据。
  2. Java服务器使用服务器套接字接收此数据并存储为字节数组。
  3. 这是代码......

       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();
    

    inputstream in开始阅读时,我buffer的价值为负值。

2 个答案:

答案 0 :(得分:3)

我认为问题是:

Java的字节已签名,您正在发送无符号字节。

来自Java docs

  

byte:字节数据类型是 8位有符号二进制补码整数。   它的最小值为-128,最大值为127(含)。   字节数据类型可用于在大型数组中保存内存,   记忆储蓄实际上很重要。它们也可以用于   int的位置,其限制有助于澄清您的代码;事实   变量的范围是有限的可以作为一种形式   文档。

您可以尝试以下内容:

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

修改  正如@Aubin所指出的,短路将是一个更好的选择,而不是一个int。

答案 1 :(得分:0)

有符号或无符号数据的表示是人类惯例。处理器在使用算术时使用此约定。

这不是这种情况:它的读取和写入都很简单,第7位被用作否定标志或者没有效果。

使用ByteBuffer可以使用字节缓冲区或更好的方式读取套接字并写入文件。 I suggest a buffer size of 8K

使用java.nio.channels重写代码可能会更好。