typescript 有什么方法可以让我在Deno中得到一个缓冲区的地址吗?

dzjeubhm  于 2023-01-14  发布在  TypeScript
关注(0)|答案(1)|浏览(137)

在Deno中,Buffer.fromof node的等价物如下所示:

import {Buffer} from "https://deno.land/std/io/buffer.ts";
const buf=new Buffer(new Uint8Array(10).fill(41));

在节点i中,可以使用**buf.address()**从“ffi-napi”插件中获取缓冲区的引用地址,如下所示:

var FFI = require('ffi-napi');
var buf= Buffer.from([0x41,0x41,0x41,0x41])
console.log(buf.address())

Deno已经内置了对ffi的支持,可以用Deno.dlopen加载外部库,但没有获取指向缓冲区指针的方法
有没有办法我可以在德诺这样做?

wh6knrhe

wh6knrhe1#

在Deno 1.24中,您可以使用Deno.UnsafePointer.of

const ptr: bigint = Deno.UnsafePointer.of(new Uint8Array([1, 2, 3]));
call_symbol(ptr, 3);

根据您的使用情况,您可能不需要实际地址。Deno 1.15增加了一些FFI改进,包括在Deno.dlopen中支持缓冲区参数:
示例:

// print_buffer.rs
#[no_mangle]
pub extern "C" fn print_buffer(ptr: *const u8, len: usize) {
  let buf = unsafe { std::slice::from_raw_parts(ptr, len) };
  println!("{:?}", buf);
}

德诺的电话:

// print_buffer.ts
const library = Deno.dlopen("./print_buffer.so", {
  print_buffer: {
    parameters: ["buffer", "usize"],
    result: "void",
  },
});

const buffer = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
dylib.symbols.print_buffer(buffer, buffer.length);

结果:

$ deno run --allow-ffi --unstable print_buffer.ts
[1, 2, 3, 4, 5, 6, 7, 8]

同一篇博客文章提到了更多即将到来的支持:
除了传递buffers-as-arg之外,我们认识到能够使用buffers-as-return-value的重要性,并计划在未来的版本中支持此特性。
如果您确实需要在JS/TS代码中使用该地址,那么您可以创建一个外部库API调用,以便从您正在使用的本机语言中公开该地址。如果您认为这是应该内置的内容,那么我建议使用submitting a new issue.

相关问题