java - InputStream.read() 在我的缓冲区中丢失或添加了一个值 - 这是怎么回事?

标签 java android bluetooth

我在来自 BluetoothChat 示例的 ConnectedThread 的 run() 方法中创建了以下过程。

// Read from the InputStream
byte[] buffer = new byte[16];
int offset = 0;
while(buffer.length-offset != 0)
{
    int bytesRead += mmInStream.read(buffer, offset, buffer.length-offset);
    offset += bytesRead;
}
// Do stuff with the contents of the buffer

缓冲区按预期逐渐加载 16 个字节,但由于某种原因,在数组的第 10 个字节处插入了 0 并移动了包的剩余部分(因此损坏了整个包)

这是正在发生的事情的示例

以下内容是从其他客户端发送的:

[-11、126、-16、-30、-92、110、-26、13、22、91、-31、32、54、-125、-112、45]

这是我收到的:

[-11、126、-16、-30、-92、110、-26、13、22、91、0、-31、32、54、-125、-112 ]

如您所见,第 10 个字节被压​​入了一个额外的 0,并且包的其余部分向右移动(切断最后一个字节)

作为调试过程的一部分,我们尝试在 bytesRead += mmInStream.read(buffer, offset, buffer.length-offset) 处设置断点,令我们惊讶的是整个原始消息已收到。给出了什么?

读取中的“中断”如何纠正此问题?我做错了什么或不理解吗?

最佳答案

也许你的意思是

bytesRead = mmInStream.read(buffer, offset, buffer.length-offset);
offset += bytesRead;

而不是

bytesRead += ...

关于java - InputStream.read() 在我的缓冲区中丢失或添加了一个值 - 这是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16448531/

相关文章:

java - 复杂的lookbehind中的无限量词

java - 使用 Java 中的字段继承 Scala 特征

android - 尽管数据显示在浏览器中,但我无法将数据从服务器检索到 android studio

android - for循环使用原始音乐数组android

java - 更改用户后 Hibernate 不运行

java - 将值从表单提交到方法,无需在 BackingBean 中使用变量

android - 将行为与 Android 中的 Intent 混淆

ios - 核心蓝牙读取数据

ios - swift 4 iOS : Does not discover services of connected BLE device

python - 如何在 Windows 8.1 上安装 PyBluez?