【问题标题】:Is there any way i can get the address of a Buffer in Deno?有什么方法可以在 Deno 中获取 Buffer 的地址吗?
【发布时间】:2021-10-19 00:57:59
【问题描述】:

在 Deno 中相当于 Buffer.from 的节点是这样的:

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

在节点中,我可以使用 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 加载外部库,但不是获取缓冲区指针的方法

有什么方法可以在 Deno 中做到这一点吗??

【问题讨论】:

  • 我在 Node.js 中的 Buffer 实例上找不到任何有关 address 属性的文档(例如 Buffer | Node.js v14.18.1 Documentation)。您能否链接到您提到的属性的文档和/或提供可执行示例?当我运行buf.address 时,我得到undefined
  • 是的,我不好,我会编辑问题,可以使用节点插件“ffi-napi”获取缓冲区的地址

标签: typescript memory buffer deno


【解决方案1】:

根据您的用例,您可能不需要实际地址。 Deno 1.15 添加了一些 FFI improvements 包括对 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);
}

从 Deno 调用它:

// 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]

同一篇博文提到了更多支持:

除了将缓冲区作为参数传递之外,我们还认识到能够使用缓冲区作为返回值的重要性,并计划在即将发布的版本中支持此功能。

如果您确实需要在您的 JS/TS 代码中出于某种目的使用该地址,那么您可以创建一个外部库 API 调用,以便从您正在使用的本机语言中公开这些地址。如果这是您认为应该构建的东西 -然后我建议submitting a new issue.

【讨论】:

  • 是的,我将遵循从 dll 公开功能的解决方案,我只是尝试在 deno 中使用“ffi-napi”,使用 CommonJS 模块加载或从 CDN 导入,但没有运气。谢谢
  • 你还需要实际地址吗?如果您不打算将它用于调用其他代码之外的任何其他用途,您可能不需要实际地址……
  • 我设法通过将Rust中的buf作为ref返回给切片来获得实际地址,并且正确的地址是返回地址之后的16个字节(我想前16个字节包含切片的大小),有趣的是我发现了 Deno ffi 无法处理 64 位整数的困难方式,所以我无法使用 ffi (github.com/denoland/deno/issues/11641) 将地址传递给另一个函数...
猜你喜欢
  • 1970-01-01
  • 2019-12-23
  • 2021-08-08
  • 2013-03-26
  • 2018-11-04
  • 1970-01-01
  • 2013-03-05
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多