用包含二进制文件数据的许多字段初始化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", [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中设置,我可以用2-3行代码将二进制数据fread()到一个结构体中。有什么方法可以让我模仿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
所以你可以创建你的类型,假设它的所有部分都很简单,它就可以工作了。你怎么能读取一个ascii字符串,虽然没有事先知道它有多长?这在C语言中也行不通。这种方式只能读取基本位类型

相关内容

  • 没有找到相关文章

最新更新