diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/communicator/CobsCoDec.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/communicator/CobsCoDec.java index 58b290aea1..4185e55591 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/communicator/CobsCoDec.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/communicator/CobsCoDec.java @@ -80,11 +80,13 @@ public class CobsCoDec { // this implementation of COBS relies on a leading and a trailing 0 byte (the former is not part of default implementations) public static byte[] encode(byte[] data) { - ByteBuffer encodedBytesBuffer = ByteBuffer.allocate((data.length * 2) + 1); // Maximum expansion + ByteBuffer encodedBytesBuffer = ByteBuffer.allocate((data.length * 2) + 2); // Maximum expansion encodedBytesBuffer.put((byte) 0);// Garmin initial padding ByteBuffer buffer = ByteBuffer.wrap(data); + boolean lastByteWasZero = false; + while (buffer.position() < buffer.limit()) { int startPos = buffer.position(); int zeroIndex = buffer.position(); @@ -93,6 +95,8 @@ public class CobsCoDec { zeroIndex++; } + lastByteWasZero = buffer.position() > zeroIndex; + int payloadSize = zeroIndex - startPos; while (payloadSize >= 0xFE) { @@ -104,16 +108,10 @@ public class CobsCoDec { encodedBytesBuffer.put((byte) (payloadSize + 1)); encodedBytesBuffer.put(data, startPos, payloadSize); + } - if (buffer.hasRemaining()) { - zeroIndex++; // Include the zero byte in the next block - } - - if (!buffer.hasRemaining() && payloadSize == 0) { - break; - } - - buffer.position(zeroIndex); + if (lastByteWasZero) { + encodedBytesBuffer.put((byte) 0x01); } encodedBytesBuffer.put((byte) 0); // Append a zero byte to indicate end of encoding