![](/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.