On Saturday, 7 February 2015 at 12:04:12 UTC, Nicholas Wilson wrote:
Are you wanting to to convert each element in arr to a byte thus truncating and losing data (when T.sizeof != 1)?
as in
toBytes([1,2,3, 42, 500 /*this will be truncated to 244 */]);// T == int here or are you wanting to convert each element to a ubyte array and then concatenate it to the result.
as is
     ubyte[] toBytes(T)(T[] arr)
     {
         ubyte[T.sizeof] buf;
         if (arr is null)
         {
             return null;
         }

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

         foreach (i, val; arr)
         {
buf[] = cast(ubyte[T.sizeof])&(arr[i])[0 .. T.sizeof]
             result ~= buf;
         }

         return result;
     }
?

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:

    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;
    }

Reply via email to