Thanks Patrick.  Yes StrPack is the way to go then.  My only warning is
that StrPack has a bunch of logic for endianness, etc which slows it down a
little, but for most purposes it should work well.  (Also, it might have
changed since I last tried it ~8 months ago, so ymmv)

On Sat, Oct 3, 2015 at 5:26 PM, Patrick O'Leary <[email protected]>
wrote:

> Going back to StrPack, there's syntax for that:
>
> @struct type SomeThings
>     anInt::Int32
>     aVectorWithSixElements::Vector{Int32}(6)
>     aStringOfEightBytes::ASCIIString(8)
> end
>
>
> On Friday, October 2, 2015 at 9:01:29 AM UTC-5, David McInnis wrote:
>>
>> @Tom :  I couldn't figure out how to do arrays or strings of a specific
>> number of bytes.
>>
>>
>> On Thursday, October 1, 2015 at 6:41:30 PM UTC-4, Tom Breloff wrote:
>>>
>>> This is exactly what my packedStruct macro is for... define the type
>>> (composed of bitstypes) and the macro will set up helper methods to read
>>> raw bytes into the fields.  I'm curious if it suits your needs, and what is
>>> missing.
>>>
>>> On Thu, Oct 1, 2015 at 3:39 PM, David McInnis <[email protected]>
>>> wrote:
>>>
>>>> Related follow-on question..
>>>>
>>>> Is there a nice way to get the data into a   type  format rather than a
>>>>  dict ?
>>>>
>>>> Here's the form I'm using now..
>>>> function DNP(myfile::String)
>>>>
>>>> dnp = { "File" => myfile }
>>>> fh = open(myfile, "r")
>>>>
>>>> dnp["Label"] = bytestring(readbytes(fh, 4))
>>>> dnp["Version"] = read(fh, Uint32)
>>>> dnp["Revision"] = read(fh, Uint32)
>>>> dnp["Date"] = bytestring(readbytes(fh, 28))
>>>> dnp["FileFormat"] = read(fh, Uint32)
>>>> dnp["FileType"] = bytestring(readbytes(fh,4))
>>>> dnp["OriginalFileName"] = bytestring(readbytes(fh,68))
>>>> dnp["ReferenceFileName"] = bytestring(readbytes(fh,68))
>>>> dnp["RelatedFileNameA"] = bytestring(readbytes(fh,68))
>>>> dnp["RelatedFileNameB"] = bytestring(readbytes(fh,68))
>>>> dnp["RelatedFileNameC"] = bytestring(readbytes(fh,68))
>>>> dnp["Annotate"] = bytestring(readbytes(fh,84))
>>>> dnp["InstrumentModel"] = bytestring(readbytes(fh,36))
>>>> dnp["InstrumentSerialNumber"] = bytestring(readbytes(fh,36))
>>>> dnp["SoftwareVersionNumber"] = bytestring(readbytes(fh,36))
>>>> dnp["CrystalMaterial"] = bytestring(readbytes(fh,36))
>>>> dnp["LaserWavelengthMicrons"] = read(fh, Float64)
>>>> dnp["LaserNullDoubling"] = read(fh, Uint32)
>>>> dnp["Padding"] = read(fh, Uint32)
>>>> dnp["DispersionConstantXc"] = read(fh, Float64)
>>>> dnp["DispersionConstantXm"] = read(fh, Float64)
>>>> dnp["DispersionConstantXb"] = read(fh, Float64)
>>>> dnp["NumChan"] = read(fh, Uint32)
>>>> dnp["InterferogramSize"] = read(fh, Uint32)
>>>> dnp["ScanDirection"] = read(fh, Uint32)
>>>> dnp["ACQUIREMODE"] = read(fh, Uint32)
>>>> dnp["EMISSIWITY"] = read(fh, Uint32)
>>>> dnp["APODIZATION"] = read(fh, Uint32)
>>>> dnp["ZEROFILL"] = read(fh, Uint32)
>>>> dnp["RUNTIMEMATH"] = read(fh, Uint32)
>>>> dnp["FFTSize"] = read(fh, Uint32)
>>>> dnp["NumberOfCoAdds"] = read(fh, Uint32)
>>>> dnp["SingleSided"] = read(fh, Uint32)
>>>> dnp["ChanDisplay"] = read(fh, Uint32)
>>>> dnp["AmbTemperature"] = read(fh, Float64)
>>>> dnp["InstTemperature"] = read(fh, Float64)
>>>> dnp["WBBTemperature"] = read(fh, Float64)
>>>> dnp["CBBTemperature"] = read(fh, Float64)
>>>> dnp["TEMPERATURE_DWR"] = read(fh, Float64)
>>>> dnp["EMISSIVITY_DWR"] = read(fh, Float64)
>>>> dnp["LaserTemperature"] = read(fh, Float64)
>>>> dnp["SpareI"] = read(fh, Uint32,10)
>>>> dnp["SpareF"] = read(fh, Float64,10)
>>>> dnp["SpareNA"] = bytestring(readbytes(fh,68))
>>>> dnp["SpareNB"] = bytestring(readbytes(fh,68))
>>>> dnp["SpareNC"] = bytestring(readbytes(fh,68))
>>>> dnp["SpareND"] = bytestring(readbytes(fh,68))
>>>> dnp["SpareNE"] = bytestring(readbytes(fh,68))
>>>> dnp["End"] = bytestring(readbytes(fh,4))
>>>>
>>>>
>>>> dnp["Interferograms"] = read(fh, Int16, dnp["InterferogramSize"],
>>>> dnp["NumberOfCoAdds"])
>>>> fft_size = dnp["FFTSize"] * dnp["ZEROFILL"] * 512
>>>> dnp["Spectrum"] = read(fh, Float32, fft_size)
>>>>
>>>> close(fh)
>>>>
>>>> wavelength_range = 10000.0 / dnp["LaserWavelengthMicrons"]
>>>> spectral_range = wavelength_range / 2
>>>> spectral_binsize = spectral_range / fft_size
>>>> x_fft = [0:fft_size-1] * spectral_binsize
>>>> m = dnp["DispersionConstantXm"]
>>>> b = dnp["DispersionConstantXb"]
>>>> c = dnp["DispersionConstantXc"]
>>>> x_corrected = x_fft + c + exp10(m * x_fft + b)
>>>> dnp["WL_cm"] = x_corrected
>>>> dnp["WL_microns"] = 10000.0 ./ x_corrected
>>>>
>>>>
>>>> return dnp
>>>> end
>>>>
>>>> Which works fine, but it leaves me with the data in a form that's ugly
>>>> (to me) in calculations:  dnp["InterferogramSize"] * dnp["NumberOfCoAdds"]
>>>> Instead of:    dnp.InterferogramSize * dnp.NumberOfCoAdds
>>>>
>>>> I can create an appropriate type like:
>>>> type DNP
>>>> Label
>>>> Version
>>>> Revision
>>>> Date
>>>> #### etc etc
>>>> end
>>>>
>>>> ..but I can't figure out a good way to get the data there.    Well,
>>>> other than keeping my current function, defining the type, and then having
>>>> another function to copy the data into the type...     ugggggly.
>>>>
>>>> I read all the docs I could find on types but never saw anything that
>>>> hinted at a solution..    maybe a  function/type hybrid??
>>>> I tried creating the type within the function but didn't get anywhere.
>>>> Ideas?
>>>>
>>>
>>>

Reply via email to