1

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

  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我对buffer.

4

2 回答 2

4

我认为问题是:

Java 的字节是有符号的,而您正在发送无符号字节。

来自Java 文档

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

您可以尝试以下方法:

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

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

于 2013-09-05T06:16:41.650 回答
0

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

这里不是这种情况:它是简单的读取和写入,而第 7 位被用作否定标志或不作为无效的事实。

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

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

于 2013-09-05T07:39:00.833 回答