struct to byte[]

Derek Parnell derek at nomail.afraid.org
Wed Dec 13 21:51:08 PST 2006


On Wed, 13 Dec 2006 20:48:43 -0800, BCS wrote:

> Derek Parnell wrote:
>> 
>> Yes, but unfortunately the actual function is faulty. Here is what I had to
>> do to get it to work ...
>> 
>> ubyte [] toByteArray (T) (inout T t)
>> {
>>     union ubyte_abi
>>     {
>>         ubyte[] x;
>>         struct
>>         {
>>            uint  xl; // length
>>            void* xp; // ptr
>>         }
>>     }
>>     ubyte_abi res;
>>     res.xp = cast(void*)&t;
>>     res.xl = T.sizeof;
>>     return res.x;
>> }
>> 
> 
> What didn't work???
> Unless arrays are broken, that should be the same.;

The original function was 

  ubyte [] toByteArray (T) (T t) 
  {
     return (cast(ubyte *)&t)[0..T.sizeof].dup
  }

With this, the '&t' phrase takes the address of the data as
passed-by-value. Which means that when passing a struct or basic type, you
get the address of the copy of the data which of course is not in scope
when you return from the function. The '.dup' takes another copy of the
data (this time on the heap) and you return the ubyte[] reference to the
second copy. So you end up with a ubyte[] array that references a copy of
the struct/data you supplied to the function and doesn't reference the
initial data at all. Of course, that might be what you are trying to do ;-)
I just thought that what was being attempted was to have a ubyte[] to
access the data in the original struct instance and not a copy of it.


My function avoids taking copies of the data and returns a ubyte[]
reference to the actual struct/data instance passed to the function.

Both are invoked with identical syntax thanks to IFTI and D's handling of
inout parameters.

-- 
Derek
(skype: derek.j.parnell)
Melbourne, Australia
"Down with mediocrity!"
14/12/2006 4:42:50 PM



More information about the Digitalmars-d mailing list