Woah, thanks a lot! Worked like a charm : )

On Tue, Mar 3, 2015 at 8:48 PM, Jameson Nash <[email protected]> wrote:

> bytestring(convert(Ptr{UInt8}, fevent.message + sizeof(UInt16)),
> unsafe_load(convert(Ptr{UInt16}, fevent.message)))
>
> On Tue, Mar 3, 2015 at 4:49 AM Roger Herikstad <[email protected]>
> wrote:
>
>> Dear group,
>>  I am trying to write an interface to a c library that reads data files
>> in a particular format. One of the pieces of data I am trying to read is a
>> string, encoded like this:
>>
>> typedef struct {
>>                 INT16 len;
>>                 char c;
>>                } LSTRING;
>>
>>
>> This is string is a member of larger structure
>>
>> typedef struct  {
>>
>>                    ... a bunch of simple bit types
>>                   LSTRING *message;
>>           } FEVENT
>>
>> I have created a Julia type that maps to this structure, where the
>> LSTRING type is defined like this
>>
>> type LSTRING
>>     len::Int16
>>     c::Uint8
>> end
>>
>>
>> Using ccall, I can successfully extract the FEVENT structure from the
>> file. but of course the message field is returned as a pointer. My
>> questions is how can I follow this pointer to get the actual data of the
>> string? In an example written in C, the string is extracted by reading an
>> array starting at the address of the field 'c' in LSTRING.
>> Initially, I was using unsafe_load to copy the data that '*message'
>> points to, but then I lose the original memory location of 'c'.
>>
>> Is there a way for me to do C-style pointer arithmetic in Julia to get
>> the data from my string. Something like this?
>>
>> char *msg = &(fevent->message->c);
>>
>>
>> Any insight into this would be greatly appreciated. I suppose I could
>> write the code to access LSTRING in C, but I was hoping to avoid that.
>>
>>
>>
>>
>>
>>
>


-- 
~ Roger

Reply via email to