![](/img/trans.png)
[英]Java Socket InputStream reads data but return in the wrong order
[英]Java Socket Inputstream Reading Wrong Data
誰能告訴我這段代碼有什么問題,我所做的是
這是代碼...
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.