从本机指针中获取数据

时间:2018-06-28 11:13:36

标签: perl6 nativecall

将数据放入Perl 6本机指针没什么大不了的:

Highcharts.setOptions()

但是,除了nativecast显然是朝相反的方向起作用,或者至少不是朝着Christoph's answer起作用,我看不到除了创建函数来将它们移出sub memcpy( Pointer[void] $source, Pointer[void] $destination, int32 $size ) is native { * }; my Blob $blob = Blob.new(0x22, 0x33); my Pointer[void] $src-memcpy = nativecast(Pointer[void], $blob); my Pointer[void] $dest-memcpy = malloc( 32 ); memcpy($src-memcpy,$dest-memcpy,2); my Pointer[int] $inter = nativecast(Pointer[int], $dest-memcpy); say $inter; # prints NativeCall::Types::Pointer[int]<0x4499560> 之外的其他方法。强制转换为非本地类型(其名称应显而易见)。你会怎么做?

更新:例如,使用数组将使其更可行。但是

Pointer[int]

这可行,但是会产生错误:my $inter = nativecast(CArray[int16], $dest); .say for $inter.list;

更新2 :在Buf之后(谢谢!),我们可以对其进行进一步的阐述,然后将值放回到we use pointer arithmetic

Don't know how many elements a C array returned from a library

我们需要将指针强制转换为与缓冲区使用的类型完全相同的类型,然后{{3}}对其进行运行。但是,我们使用sub malloc(size_t $size --> Pointer) is native {*} sub memcpy(Pointer $dest, Pointer $src, size_t $size --> Pointer) is native {*} my $blob = Blob.new(0x22, 0x33); my $src = nativecast(Pointer, $blob); my $dest = malloc( $blob.bytes ); memcpy($dest, $src, $blob.bytes); my $inter = nativecast(Pointer[int8], $dest); my $cursor = $inter; my Buf $new-blob .= new() ; for 1..$blob.bytes { $new-blob.append: $cursor.deref; $cursor++; } say $new-blob; 来知道何时结束循环,这仍然有点麻烦。会有更直接的方法吗?还是只是使用Bufs / Blob的一种方法,以便可以轻松将它们复制到Native领域并返回?

2 个答案:

答案 0 :(得分:7)

完整示例:

use NativeCall;

sub malloc(size_t $size --> Pointer) is native {*}
sub memcpy(Pointer $dest, Pointer $src, size_t $size --> Pointer) is native {*}

my $blob = Blob.new(0x22, 0x33);
my $src = nativecast(Pointer, $blob);
my $dest = malloc(nativesizeof(int16));
memcpy($dest, $src, nativesizeof(int16));
my $inter = nativecast(Pointer[int16], $dest);
say $inter.deref.fmt('%x');

我假设您正在寻找deref方法,但是您的代码还有其他一些问题:

  • int32的声明中使用size_t代替memcpy
  • memcpy的参数顺序错误,这意味着您要将从未初始化的内存读取的两个字节复制到您应该不可变的Blob中
  • 使用普通int的地方,您可能应该使用诸如int16之类的大小整数类型

还请注意,在Pointer的声明中使用普通的memcpy,这将允许您传递任何指针类型,而不必不断地进行强制转换。

答案 1 :(得分:1)

使用NativeHelpers::Blob

$cond

该程序extends Christoph's answer添加了use NativeCall; use NativeHelpers::Blob; sub malloc(size_t $size --> Pointer) is native {*} sub memcpy(Pointer $dest, Pointer $src, size_t $size --> Pointer) is native {*} my $blob = Blob.new(0x22, 0x33); my $src = nativecast(Pointer, $blob); my $dest = malloc( $blob.bytes ); memcpy($dest, $src, $blob.bytes); my $inter = nativecast(Pointer[int8], $dest); my Blob $esponja = blob-from-pointer( $inter, :2elems, :type(Blob[int8])); say $esponja; 函数,该函数将返回原始的blob:blob-from-pointer。这个答案现在也是in the documentation