繁体   English   中英

Java Socket Inputstream读取错误的数据

[英]Java Socket Inputstream Reading Wrong Data

谁能告诉我这段代码有什么问题,我所做的是

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

这是代码...

   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读取时inputstream in我在buffer上得到负值。

我认为问题是:

Java的字节已签名,您正在发送未签名的字节。

Java文档

byte:byte数据类型是8位带符号的二进制补码整数 最小值为-128,最大值为127(含)。 字节数据类型对于在大数组中节省内存非常有用,因为内存节省实际上很重要。 在限制可以帮助您澄清代码的地方,也可以使用它们来代替int。 变量范围有限的事实可以作为文档的一种形式。

您可以尝试如下操作:

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

编辑:正如@Aubin所指出的,short会是一个更好的选择,而不是int。

将数据表示为有符号或无符号是一种人类习惯。 使用算术时,处理器使用此约定。

事实并非如此:这是简单的读写操作,并且第7位用作否定标志或不起作用的事实。

读取套接字和写入文件可以使用字节缓冲区完成,也可以使用ByteBuffer更好。 我建议缓冲区大小为8K

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM