The original code I was using was written in Java, and only had a method for strings. This is closer to what I wanted. My unit tests were just going back and forth with readString function, so I was completely missing this for other types. Nice catch!

There were a couple issues with your code so I've included the corrected version:


That's what I get for replying at 11pm =p
    ubyte[] toUbytes(T)(T[] arr)
    {
        if (arr is null)
        {
            return null;
        }

        ubyte[T.sizeof] buffer;
        ubyte[] result = new ubyte[arr.length * T.sizeof];

        foreach (i, val; arr)
        {
buffer[] = cast(ubyte[T.sizeof])(&(arr[i]))[0 .. T.sizeof]; // Parenthesis and missing semicolon result[i * T.sizeof .. (i * T.sizeof) + T.sizeof] = buffer; // Specify appropriate slice for buffer to be inserted into
        }

        return result;
    }
 thinking about it again this can be done in a single memcpy

     ubyte[] toUbytes(T)(T[] arr)
     {
         if (arr is null)
         {
             return null;
         }

         ubyte[] result = new ubyte[arr.length * T.sizeof];

        memcpy(result.ptr, arr.ptr , arr.length * T.sizeof);
        return result;
    }

and an asUbytes can be done as a cast

     ubyte[] toUbytes(T)(T[] arr)
     {
         if (arr is null)
         {
             return null;
         }
return cast(ubyte[]) arr.ptr [0 .. arr.length * T.sizeof];
     }

Reply via email to