簡體   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