mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2026-07-31 07:44:24 +02:00
Garmin: fix CobsCoDec.encode
Co-authored-by: José Rebelo <joserebelo@outlook.com>
This commit is contained in:
committed by
José Rebelo
co-authored by
José Rebelo
parent
165cd803a0
commit
076a85d762
+7
-9
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user