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