usb host问题

最近的项目是关于Usb host的,在进行文件互导时发现一些问题

使用pull拉取文件时,分段读取的DATA及大小不准确

解决方法:

在没有读取到DONE字符前,需要一直读取out端口,直到没有数据流为止,否则会影响下次操作。

对于上次的缓存,如果大小超出真实文件大小,则从末尾截取包含DONE信息的缓存,否则清空缓存,重新读取out端口

PS:结束操作的情况只能是获取到DONE或out端口没有新数据。


附上接收的方法

	public int receive(final int streamId, final int peerStreamId,
			ByteBuffer packetBuffer, ByteBuffer buffer) {
		int result = 0;
		try {
			int offset = 0;
			boolean hasNext = true;
			while (hasNext) {
				int packetDataSize = 0;
				if (0 == packetBuffer.position()) {
					byte[] payloadBuffer = new byte[AdbMessage.MAX_PAYLOAD];
					if (0 < (packetDataSize = read(streamId, peerStreamId,
							payloadBuffer))) {
						packetBuffer.put(payloadBuffer, 0, packetDataSize);
						packetBuffer.rewind();
						if (0 == offset) {
							byte[] cmd = new byte[4];
							if (packetDataSize >= 4) {
								packetBuffer.get(cmd);
								if ("DATA".equalsIgnoreCase(new String(cmd))) {
									offset = packetBuffer.getInt();
									packetDataSize -= 8;
								} else if ("DONE".equalsIgnoreCase(new String(
										cmd))) {
									return result;
								} else {
									result = -1;
									return result;
								}
							} else {
								result = -1;
								return result;
							}
						}
					} else {
						break;
					}
				} else {
					packetDataSize = packetBuffer.capacity()
							- packetBuffer.position();
					byte[] cmd = new byte[4];
					if (packetDataSize >= 4) {
						packetBuffer.get(cmd);
						if ("DATA".equalsIgnoreCase(new String(cmd))) {
							offset = packetBuffer.getInt();
							packetDataSize -= 8;
						} else if ("DONE".equalsIgnoreCase(new String(cmd))) {
							return result;
						} else {
							packetBuffer.clear();
							continue;
						}
					} else {
						packetBuffer.clear();
						continue;
					}
				}

				if (0 == result) {
					if (offset >= packetDataSize) {
						if (buffer.remaining() >= packetDataSize) {
							if (0 < packetDataSize) {
								buffer.put(packetBuffer);
								offset -= packetDataSize;
							}
							packetBuffer.clear();
						} else {
							if (buffer.remaining() <= 0) {
								packetBuffer.clear();
								continue;
							}
							offset = buffer.remaining() + 4;
							packetBuffer.position(packetBuffer.capacity()
									- offset);
						}
					} else {
						if (buffer.remaining() <= 0) {
							packetBuffer.clear();
							continue;
						}
						if (buffer.remaining() >= offset) {
							buffer.put(packetBuffer.array(),
									packetBuffer.position(), offset);
							packetBuffer.position(packetBuffer.position()
									+ offset);
							offset = 0;
						} else {
							result = -1;
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		} catch (StackOverflowError e) {
			e.printStackTrace();
			return -1;
		} catch (OutOfMemoryError e) {
			e.printStackTrace();
			System.gc();
			return -1;
		}
		return result;
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值