diff --git a/android_app/app/src/main/java/com/health/openscale/core/utils/Converters.java b/android_app/app/src/main/java/com/health/openscale/core/utils/Converters.java index 046deee0..f5087113 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/utils/Converters.java +++ b/android_app/app/src/main/java/com/health/openscale/core/utils/Converters.java @@ -143,6 +143,13 @@ public class Converters { return data; } + public static int fromUnsignedInt24Le(byte[] data, int offset) { + int value = (data[offset + 2] & 0xFF) << 16; + value += (data[offset + 1] & 0xFF) << 8; + value += data[offset] & 0xFF; + return value; + } + public static long fromUnsignedInt32Be(byte[] data, int offset) { long value = (long) (data[offset] & 0xFF) << 24; value += (data[offset + 1] & 0xFF) << 16; diff --git a/android_app/app/src/test/java/com/health/openscale/ConvertersTest.java b/android_app/app/src/test/java/com/health/openscale/ConvertersTest.java index 4c8fb7d7..eee19ac4 100644 --- a/android_app/app/src/test/java/com/health/openscale/ConvertersTest.java +++ b/android_app/app/src/test/java/com/health/openscale/ConvertersTest.java @@ -102,6 +102,15 @@ public class ConvertersTest { Converters.toUnsignedInt16Be(0xffff), 0)); } + @Test + public void unsignedInt24Converters() throws Exception { + byte[] data = new byte[]{(byte) 0xfd, (byte) 0xfe, (byte) 0xfc, (byte) 0x10, (byte) 0x7f}; + + assertEquals(0xfcfefd, Converters.fromUnsignedInt24Le(data, 0)); + assertEquals(0x10fcfe, Converters.fromUnsignedInt24Le(data, 1)); + assertEquals(0x7f10fc, Converters.fromUnsignedInt24Le(data, 2)); + } + @Test public void unsignedInt32Converters() throws Exception { byte[] data = new byte[]{(byte) 0xf1, (byte) 0xf2, (byte) 0xf3, (byte) 0x7f, (byte) 0x7e};