如何复制Ruby Fiddle结构体的示例?

x8goxv8g  于 2023-08-04  发布在  Ruby
关注(0)|答案(1)|浏览(109)

如何复制Fiddle结构的示例并不明显。我发现了一个丑陋的解决方案,使用Fiddle::Pointer像这样。

require 'fiddle/import'

X = Fiddle::Importer.struct [
  'int a',
  'int b',
]

x = X.malloc
x.a = 1
x.b = 2

x2 = X.malloc
Fiddle::Pointer.new(x2.to_i)[0, X.size] = x.to_ptr.to_s
x2.b = 3
p [x.b, x2.b]

字符串
有没有更好的办法?我想到的另一种方法是使用x2.to_ptr的超类(Fiddle::Pointer)的[]=操作符,但它比上面的解决方案更糟糕。

wqsoz72f

wqsoz72f1#

Fiddle::Importer.struct返回的类实现了[][]=,以按名称检索和设置结构体成员:

x['a'] #=> 1
x['b'] #=> 2

字符串
但是,当使用2个参数调用时,这些方法的行为与Fiddle::Pointer方法类似,并获取/设置原始二进制数据:

x[0, 4] #=> "\x01\x00\x00\x00"   <- a's binary data
x[4, 4] #=> "\x02\x00\x00\x00"   <- b's binary data

x[4, 4] = [-5].pack('l') #=> "\xFB\xFF\xFF\xFF"
x.b #=> -5


要将x的整个数据复制到x2,请执行以下操作:

x2[0, X.size] = x[0, X.size]

x2.a #=> 1
x2.b #=> 2

相关问题