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 ビットの符号付き 2 の補数の整数です。最小値は -128 で、最大値は 127 (両端を含む) です。バイト データ型は、メモリの節約が実際に重要な大きな配列でメモリを節約するのに役立ちます。これらは、制限がコードを明確にするのに役立つ int の代わりに使用することもできます。変数の範囲が制限されているという事実は、ドキュメントの形式として役立ちます。

次のようなものを試すことができます:

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

編集: @Aubin で指摘されているように、int ではなく short の方が適しています。

于 2013-09-05T06:16:41.650 に答える
0

署名付きまたは署名なしとしてのデータの表現は、人間の慣習です。この規則は、演算が使用されるときにプロセッサによって使用されます。

ここではそうではありません。単純な読み取りと書き込みであり、ビット 7 が負のフラグとして使用されているか、または効果がないという事実です。

ソケットの読み取りとファイルの書き込みは、バイト バッファーまたはByteBufferを使用して行うことができます。8K のバッファー サイズをお勧めします。

java.nio.channelsを使用してコードを書き直す方がよい場合があります。

于 2013-09-05T07:39:00.833 に答える