任何人都可以说出这段代码有什么问题,我做的是
这是代码......
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
的价值为负值。
答案 0 :(得分:3)
我认为问题是:
Java的字节已签名,您正在发送无符号字节。
来自Java docs:
byte:字节数据类型是 8位有符号二进制补码整数。 它的最小值为-128,最大值为127(含)。 字节数据类型可用于在大型数组中保存内存, 记忆储蓄实际上很重要。它们也可以用于 int的位置,其限制有助于澄清您的代码;事实 变量的范围是有限的可以作为一种形式 文档。
您可以尝试以下内容:
short bVal = /*signed byte*/;
if (bVal < 0)
bVal = bVal + 256; //Convert to positive
修改强> 正如@Aubin所指出的,短路将是一个更好的选择,而不是一个int。
答案 1 :(得分:0)
有符号或无符号数据的表示是人类惯例。处理器在使用算术时使用此约定。
这不是这种情况:它的读取和写入都很简单,第7位被用作否定标志或者没有效果。
使用ByteBuffer可以使用字节缓冲区或更好的方式读取套接字并写入文件。 I suggest a buffer size of 8K
使用java.nio.channels重写代码可能会更好。