gpt4 book ai didi

raku - 从 Native 指针中获取数据

转载 作者:行者123 更新时间:2023-12-01 22:33:30 25 4
gpt4 key购买 nike

将数据获取到 Perl 6 Native 指针中没什么大不了的:

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] 中取出,因为 nativecast显然是在相反的方向上工作,或者至少不是在转换为非本地类型的方向上(从名字上应该很明显)。你会怎么做?

更新:例如,使用数组会使其更可行。然而

my $inter = nativecast(CArray[int16], $dest);
.say for $inter.list;

这可以工作,但会产生错误:不知道 C 数组从库返回了多少个元素

更新 2:关注 Christoph's answer (谢谢!),我们可以对此进行更详细的阐述,然后我们将这些值放回到 Buf 中。

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;

我们需要将指针转换为与缓冲区使用的类型完全相同的类型,然后 we use pointer arithmetic跑过去。然而,我们使用 $blob.bytes 来知道何时结束循环,这仍然有点hacky。有没有更直接的方法呢?或者只是一种使用 Bufs/Blob 的方法,以便可以轻松地将它们复制到 native 领域并返回?

最佳答案

完整示例:

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 方法,但您的代码还存在一些其他问题:

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

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

关于raku - 从 Native 指针中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51081475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com