Quellcode durchsuchen

fix list of booleans serialization

Bert Temme vor 6 Monaten
Ursprung
Commit
ae87250de4

+ 14 - 1
src/SharpGLTF.Ext.3DTiles/Memory/BinaryTable.cs

@@ -16,6 +16,12 @@ namespace SharpGLTF.Memory
     {
         public static List<byte> GetBytesForArray<T>(List<List<T>> values)
         {
+            var type = typeof(T);
+            if(type == typeof(bool))
+            {
+                var booleanBytes = GetBytesBooleans(values.Cast<List<bool>>().ToList());
+                return booleanBytes;
+            }
             var bytes = new List<byte>();
             foreach (var value in values)
             {
@@ -26,7 +32,6 @@ namespace SharpGLTF.Memory
             return bytes;
         }
 
-
         /// <summary>
         /// Converts a list of primitive types into a byte array
         /// </summary>
@@ -81,6 +86,14 @@ namespace SharpGLTF.Memory
             }
         }
 
+        private static List<byte> GetBytesBooleans(List<List<bool>> values)
+        {
+            var bits = new BitArray(values.SelectMany(x => x).ToArray());
+            var boolBytes = new byte[(bits.Length - 1) / 8 + 1];
+            bits.CopyTo(boolBytes, 0);
+            return boolBytes.ToList();
+        }
+
         private static byte[] Matrix4x4ToBytes<T>(IReadOnlyList<T> values)
         {
             var result = new byte[values.Count * 64];

+ 18 - 0
tests/SharpGLTF.Ext.3DTiles.Tests/Memory/BinaryTableTests.cs

@@ -7,6 +7,24 @@ namespace SharpGLTF.Memory
 {
     public class BinaryTableTests
     {
+        [Test]
+        public void ConvertListofListofBoolsToBytes()
+        {
+            var values = new List<List<bool>>();
+            values.Add(new List<bool>() { true, false });
+            values.Add(new List<bool>() { false, true });
+            var bytes = BinaryTable.GetBytesForArray(values);
+            // Check size, should be 1 byte for 4 bits
+            Assert.That(bytes.Count, Is.EqualTo(1));
+
+            // read the bits back
+            var bits = new System.Collections.BitArray(bytes.ToArray());
+            Assert.That(bits[0], Is.EqualTo(true));
+            Assert.That(bits[1], Is.EqualTo(false));
+            Assert.That(bits[2], Is.EqualTo(false));
+            Assert.That(bits[3], Is.EqualTo(true));
+        }
+
         [Test]
         public void ConvertListofListofIntToBytes()
         {