This seems like it works fine to me (on both 0.3 and 0.4):

immutable Test
x::Float32
y::Int64
z::Int8
end

julia> a = [Test(1,2,3)]
1-element Array{Test,1}:
 Test(1.0f0,2,3)

julia> b = copy(reinterpret(UInt8, a))
24-element Array{UInt8,1}:
 0x00
 0x00
 0x80
 0x3f
 0x03
 0x00
 0x00
 0x00
 0x02
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x00
 0x03
 0xe0
 0x82
 0x10
 0x01
 0x00
 0x00
 0x00

julia> prim_read{T}(::Type{T}, data::Array{Uint8,1}, offset::Int) =
unsafe_load(convert(Ptr{T}, pointer(data) + offset))
prim_read (generic function with 1 method)

julia> prim_read(Test, b, 0)
Test(1.0f0,2,3)

julia> @code_native prim_read(Test, b, 0)
.section __TEXT,__text,regular,pure_instructions
Filename: none
Source line: 1
push RBP
mov RBP, RSP
Source line: 1
mov RCX, QWORD PTR [RSI + 8]
vmovss XMM0, DWORD PTR [RCX + RDX]
mov RAX, QWORD PTR [RCX + RDX + 8]
mov DL, BYTE PTR [RCX + RDX + 16]
pop RBP
ret


On Tue, Mar 24, 2015 at 5:04 PM, Simon Danisch <sdani...@gmail.com> wrote:

> There is a high chance that I simply don't understand llvmcall well
> enough, though ;)
>
> Am Montag, 23. März 2015 20:20:09 UTC+1 schrieb Sebastian Good:
>>
>> I'm trying to read some binary formatted data. In C, I would define an
>> appropriately padded struct and cast away. Is is possible to do something
>> similar in Julia, though for only one value at a time? Philosophically, I'd
>> like to approximate the following, for some simple bittypes T (Int32,
>> Float32, etc.)
>>
>> T read<T>(char* data, size_t offset) { return *(T*)(data + offset); }
>>
>> The transliteration of this brain-dead approach results in the following,
>> which seems to allocate a boxed Pointer object on every invocation. The
>> pointer function comes with ample warnings about how it shouldn't be used,
>> and I imagine that it's not polite to the garbage collector.
>>
>> prim_read{T}(::Type{T}, data::AbstractArray{Uint8, 1}, byte_number) =
>> unsafe_load(convert(Ptr{T}, pointer(data, byte_number)))
>>
>> I can reinterpret the whole array, but this will involve a division of
>> the offset to calculate the new offset relative to the reinterpreted array,
>> and it allocates an array object.
>>
>> Is there a better way to simply read the machine word at a particular
>> offset in a byte array? I would think it should inline to a single assembly
>> instruction if done right.
>>
>>
>

Reply via email to