Android字节数组批处理

时间:2011-11-25 12:55:35

标签: java android

我通过蓝牙以编程方式发送图像。当我在发送端发送图像作为字节数组时,字节数组长度为= 83402,在接收端,我得到的字节数为1024.

我想将这1024个批次组合成单字节数组,以便我再次将其转换为图像。

在msg.obj中我得到1024 bacth的字节数组。

案例MESSAGE_READ:

 byte[] readBuf = (byte[]) msg.obj;

 Bitmap bmp=BitmapFactory.decodeByteArray(readBuf,0,readBuf.length);

之后我也收到了这个警告..

“BufferedOutputStream构造函数中使用的默认缓冲区大小。如果需要8k缓冲区,最好是明确的”

任何帮助将不胜感激。

由于

2 个答案:

答案 0 :(得分:1)

大致应该是这样的:

byte[] readBuf = new byte[83402]; // this array will hold the bytes for the image, this value better be not hardcoded in your code

int start = 0;
while(/*read 1024 byte packets...*/) {
    readBuf.copyOfRange((byte[]) msg.obj, start, start + 1024); // copy received 1024 bytes
    start += 1024; //increment so that we don't overwrite previous bytes
}

/*After everything is read...*/
Bitmap bmp=BitmapFactory.decodeByteArray(readBuf,0,readBuf.length);

答案 1 :(得分:0)

我将在这里走出困境并假设您正在使用sdk中的BluetoothChat example来构建您的图像发送者​​(所有示例都与之匹配)。这是一个快速转换,我把它放在一起 - 可能不是最好的,但它有效。

你正在以1024的批量获取它们,因为在BluetoothChatService.java运行函数中它创建了一个大小为1024的缓冲区数组,它从输入流中获取信息。如果您创建另一个适合图像的缓冲区(我设置了最大1mb),那么您的运行函数将具有:

byte[] buffer = new byte[1024];
byte[] imgBuffer = new byte[1024*1024];
int pos = 0;

使用你的pos变量跟踪你在imgBuffer中的位置。

然后你只需要在图像的while(true)循环中获取块时将其复制过来(mmInStream是一个InputStream):

int bytes = mmInStream.read(buffer);
System.arraycopy(buffer,0,imgBuffer,pos,bytes);
pos += bytes;

我发送消息让它知道图像已完成发送,然后将imgBuff传递给另一个线程(此时pos的大小为imgBuffer):

mHandler.obtainMessage(BluetoothChat.IMAGE_READ, pos, -1, imgBuffer)
                        .sendToTarget();

我已经定义了IMAGE_READ解码数组,就像在MESSAGE_READ中一样:

byte[] readBuf = (byte[]) msg.obj;
BitmapFactory.decodeByteArray(readBuf, 0, msg.arg1);