我正在尝试使用套接字连接将图像从pc传输到android。我能够从pc到手机接收数据但是当我将byte[]
传递给BitmapFactory
时,它返回null。有时它会返回图像,但并非总是如此。
图片大小为40054 bytes
。我一次收到2048 bytes
,因此创建了保存byte
数据的小数据池(缓冲区)。收到完整数据后,我将其传递给BitmapFactory
。这是我的代码:
byte[] buffer = new byte[40054];
byte[] temp2kBuffer = new byte[2048];
int buffCounter = 0;
for(buffCounter = 0; buffCounter < 19; buffCounter++)
{
inp.read(temp2kBuffer,0,2048); // this is the input stream of socket
for(int j = 0; j < 2048; j++)
{
buffer[(buffCounter*2048)+j] = temp2kBuffer[j];
}
}
byte[] lastPacket=new byte[1142];
inp.read(lastPacket,0,1142);
buffCounter = buffCounter-1;
for(int j = 0; j < 1142; j++)
{
buffer[(buffCounter*2048)+j] = lastPacket[j];
}
bmp=BitmapFactory.decodeByteArray(buffer,0,dataLength); // here bmp is null
计算
[19 data buffers of 2kb each] 19 X 2048 = 38912 bytes
[Last data buffer] 1142 bytes
38912 + 1142 = 40054 bytes [size of image]
我也曾尝试一次读取完整的40054字节,但这也没有用。这是代码:
inp.read(buffer,0,40054);
bmp=BitmapFactory.decodeByteArray(buffer,0,dataLength); // here bmp is null
最后也检查了decodeStream
但结果是一样的。
知道我做错了吗?
由于
答案 0 :(得分:3)
我不知道这对你的情况是否有帮助,但一般来说你不应该依赖InputStream.read(byte [],int,int)来读取你要求的确切字节数。它只是最大值。如果查看InputStream.read文档,可以看到它返回了您应该考虑的实际读取字节数。
通常在从InputStream加载所有数据时,并希望在读取所有数据后关闭它,我会这样做。
ByteArrayOutputStream dataBuffer = new ByteArrayOutputStream();
int readLength;
byte buffer[] = new byte[1024];
while ((readLength = is.read(buffer)) != -1) {
dataBuffer.write(buffer, 0, readLength);
}
byte[] data = dataBuffer.toByteArray();
如果你只需要加载一定数量的数据,你就知道它的大小。
byte[] data = new byte[SIZE];
int readTotal = 0;
int readLength = 0;
while (readLength >= 0 && readTotal < SIZE) {
readLength = is.read(data, readTotal, SIZE - readTotal);
if (readLength > 0) {
readTotal += readLength;
}
}