Oop 使用包含二进制文件数据的多个字段初始化Julia类型
我有一个有很多字段的类型(想想几百个) Julia中的构造函数系统在我处理小类型时很好,但你可以想象,当我处理大对象时,它会变得多么笨拙:Oop 使用包含二进制文件数据的多个字段初始化Julia类型,oop,types,binary-data,julia,Oop,Types,Binary Data,Julia,我有一个有很多字段的类型(想想几百个) Julia中的构造函数系统在我处理小类型时很好,但你可以想象,当我处理大对象时,它会变得多么笨拙: type Bar a:Int32 b:Int32 c:Int32 d:Int32 e:Float32 f:Uint8 g:Int64 h:ASCIIString # ... end bar = Bar(1, 2, 3, 4, 5, 1.1, 64, 2147483648, "Wall of text", [hundred
type Bar
a:Int32
b:Int32
c:Int32
d:Int32
e:Float32
f:Uint8
g:Int64
h:ASCIIString
# ...
end
bar = Bar(1, 2, 3, 4, 5, 1.1, 64, 2147483648, "Wall of text", [hundreds more])
现在,我从一个二进制文件中读取数据。二进制文件遵循一个规范,使得第一个4字节值具有特定含义,第二个值具有另一种含义,等等
输入30分钟后,我创建了一个类型,其中所有字段都对应于二进制文件规范。字段的顺序与二进制文件中相应值的顺序相同
我真正希望的是不必键入300行代码来初始化对象:
bar2 = Bar(# here I describe what 'a' is
read(f, Int32, 1)[0],
# here I describe what 'b' is
read(f, Int32, 1)[0],
[...],
# here I describe what 'j' is
read(f, ASCIIString, 1)[0],
[...],
# this is getting long and tedious
[...])
通过使用C语言进行设置,我可以
fread()
使用2-3行代码将二进制数据转换成一个结构。有没有一种方法可以让我在Julia中模仿这种轻松感?此代码片段可能会有所帮助:
immutable TwoFloats
f1::Float32
f2::Float32
end
newtwofloats = reinterpret(TwoFloats, rand(Uint8, 8*2))
# Gives an array with two elements of type TwoFloats
dump(newtwofloats[1]) # Print them...
dump(newtwofloats[2]) # ... out
因此,您可以创建您的类型,并假设它的所有部分都很简单,那么它就可以工作了。然而,你怎么能在不提前知道它有多长的时间的情况下,阅读一本书呢?这在C语言中也不起作用。您只能以这种方式读取基本位类型。但我似乎无法访问字段
t=Twofloat
->t.f1
->错误:type数据类型没有字段f1
您的意思是,例如t=Twofloat(2.0,1.0)
t=TwoFloats
将类型TwoFloats
粘贴到t
中,而不是该类型的实例。我在代码示例中添加了一点,这可能会使它更清晰。听起来您的类型是这里的问题所在。为什么需要这么多字段?像矩阵或数据框架这样的东西更好用吗?我正在把一些东西从C翻译成Julia。我更希望数据结构在视觉上相似。也许有一种惯用的方法来构造它,但这是我正在处理的一个约束。