On Saturday, November 22, 2014 6:31:27 PM UTC-5, Patrick O'Leary wrote:
>
> On Saturday, November 22, 2014 9:57:51 AM UTC-6, Isaiah wrote:
>>
>> Have you looked at StrPack.jl? It may have a packed option. Julia uses
>> the platform ABI padding rules for easy interop with C.
>>
>
> Yes, you can used the align_packed strategy.
>
Hi Patrick,
I just checked out StrPack and installed it. I think I have it working
properly in the case of a packed immutable type that just contains
numerical fields. I'm still not sure how to make things work to unpack
fixed length strings. If my string in field "e" is a fixed-length of 4,
then my composite type looks like
@struct immutable TestType2
a::Float64
b::Int32
c::Float32
d::Int16
e::Array{Uint8,1}(4) # also tried ASCIIString(4)
end
And then I know my data on file has 10 records, I can loop through as:
data = Array(TestType2, (10,))
f = open("test1.dat", "r")
for k = 1:10
data[k] = unpack(f, TestType2, {"a"=>8, "b"=>4,"c"=>4, "d"=>2, "e"=>4},
align_packed, :NativeEndian)
println(data[k])
end
But Array{Uint8,1}(4) results in corrupted values after the first record is
read in and ASCIIString(4) gives an error:
TestType2(-1.2538434657806456,0,0.5783242f0,0,"a")
ERROR: invalid ASCII sequence
Where in the first record that appears to be read correctly (at least it
prints), the last field value should be "abcd" not "a". Am I missing
something obvious? Also, is there a strategy for combining all of this with
a memory mapped file?
I really appreciate all of the suggestions everyone has offered. It's my
first foray into Julia and I'm guessing I'm starting out with something a
little atypical. I'm hoping if I can get the data read then everything else
should be much more straight forward.