如何将javascript缓冲区传递给C程序或NAPI?

如何将javascript缓冲区传递给C程序或NAPI?,javascript,c,node.js,pointers,Javascript,C,Node.js,Pointers,我用JavaScript创建了一个缓冲区。我正在读取文件并将文件数据存储在缓冲区中。我必须将缓冲区数据传递给NAPI/c程序。我已经创建了节点模块。要在c程序/NAPI中使用JavaScript缓冲区,我需要*uint8\t。 我尝试使用napi\u get\u buffer\u info函数获取Javascript缓冲区的详细信息和数据。 我能够获得传递给NAPI/c程序的JavaScript缓冲区的长度。 示例代码 nodejstest.js var addon = require('bin

我用JavaScript创建了一个缓冲区。我正在读取文件并将文件数据存储在缓冲区中。我必须将缓冲区数据传递给NAPI/c程序。我已经创建了节点模块。要在c程序/NAPI中使用JavaScript缓冲区,我需要*uint8\t。 我尝试使用napi\u get\u buffer\u info函数获取Javascript缓冲区的详细信息和数据。 我能够获得传递给NAPI/c程序的JavaScript缓冲区的长度。 示例代码
nodejstest.js

var addon = require('bindings')('test');
const fs = require('fs');

const BUFFER_SIZE = 256;
var buffer = new Buffer.alloc(BUFFER_SIZE);
var ps_uploadPathLocal = 'sampletext.txt';
var fileHandle = fs.openSync(ps_uploadPathLocal, "rs");
var bytesRead = fs.readSync(fileHandle, buffer, 0, 50, 0);
console.log("\nPrinting Buffer value ");
console.log(buffer);
console.log("\nBuffer to String");
console.log(buffer.toString('utf8'));
console.log("Bytes Read from the string ",bytesRead);
console.log(addon.upload(buffer));  // 'world'
test.cc

#include <assert.h>
#include <node_api.h>
#include <stdio.h>

napi_value uploadfunc(napi_env env, napi_callback_info info) {
  napi_status status;
  napi_value world;

  size_t argc = 1;
  napi_value args[1];
  status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  assert(status == napi_ok);

  if (argc < 1) {
    napi_throw_type_error(env, nullptr, "Wrong number of arguments");
    return nullptr;
  }

  napi_valuetype valuetype0;
  status = napi_typeof(env, args[0], &valuetype0);
  assert(status == napi_ok);

  printf("Value type of the buffer %d \n", valuetype0);

  bool buffertype;
  status = napi_is_buffer(env, args[0], &buffertype);
  assert(status == napi_ok);
  printf("If Buffer type %d \n",buffertype);


  //napi_is_arraybuffer
  bool buffertype1;
  status = napi_is_arraybuffer(env, args[0], &buffertype1);
  assert(status == napi_ok);
  printf("If Buffer type %d \n",buffertype1);

  //napi_get_buffer_info
  size_t lengthOfBuffer;
  dataptr = &data;
  void* clsData;
  status = napi_get_buffer_info(env, args[0], &clsData,&lengthOfBuffer);
  assert(status == napi_ok);

  printf("Length of the buffer in C program %zd \n", lengthOfBuffer);

  status = napi_create_string_utf8(env, "upload", 5, &world);
  assert(status == napi_ok);
  return world;
}

#define DECLARE_NAPI_METHOD(name, func)                                        \
  { name, 0, func, 0, 0, 0, napi_default, 0 }

napi_value Init(napi_env env, napi_value exports) {
  napi_status status;
  napi_property_descriptor uploadv = DECLARE_NAPI_METHOD("upload", uploadfunc);
  status = napi_define_properties(env, exports, 1, &uploadv);
  assert(status == napi_ok);

  return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
#包括
#包括
#包括
napi_值上传函数(napi_环境、napi_回调信息){
国家适应行动方案状况;
纳皮尤价值观世界;
尺寸argc=1;
napi_值参数[1];
status=napi_get_cb_info(env、info和argc、args、nullptr、nullptr);
断言(状态==napi_ok);
如果(argc<1){
napi_抛出类型_错误(env,nullptr,“参数数目错误”);
返回空ptr;
}
napi_值类型值类型0;
status=napi_typeof(env,args[0],&valuetype0);
断言(状态==napi_ok);
printf(“缓冲区%d\n的值类型”,值类型0);
布尔缓冲型;
status=napi_是缓冲区(env,args[0],&buffertype);
断言(状态==napi_ok);
printf(“如果缓冲区类型为%d\n”,则为缓冲区类型);
//napi_是arraybuffer
布尔缓冲区类型1;
status=napi_is_arraybuffer(env,args[0],&buffertype1);
断言(状态==napi_ok);
printf(“如果缓冲区类型为%d\n”,则为缓冲区类型1);
//napi_获取缓冲区_信息
尺寸和长度缓冲器;
dataptr=&data;
无效*clsData;
status=napi\u get\u buffer\u info(env、args[0]、&clsData和lengthOfBuffer);
断言(状态==napi_ok);
printf(“C程序中缓冲区的长度%zd\n”,lengthOfBuffer);
status=napi\u create\u string\u utf8(env,“upload”、5和world);
断言(状态==napi_ok);
回归世界;
}
#定义DECLARE_NAPI_方法(名称,func)\
{name,0,func,0,0,0,napi_default,0}
napi_值初始(napi_环境,napi_值导出){
国家适应行动方案状况;
napi_属性_描述符uploadv=DECLARE_napi_方法(“upload”,uploadfunc);
status=napi_define_属性(env、exports、1和uploadv);
断言(状态==napi_ok);
出口退税;
}
NAPI_模块(节点_GYP_模块_名称,Init)
问题:
1) 如何获取Javascript缓冲区的指针(*uint8\t)并传递给c函数?

2) 如何在c程序中打印JavaScript缓冲区数据?

我猜JavaScript缓冲区只是一个简单的指针,需要长度来避免分段错误。我很快也要玩buffer和NAPI了。如果您知道如何操作,请回答。@Alexis\u FR\u JP首先我创建了一个空指针,然后将该指针传递给napi\u get\u buffer\u info函数,然后将void类型指针转换为unit\u 8类型指针。void*ptrtobuffer=NULL;uint8_t*ptrtodata;ptrtodata=(uint8_t*)ptrtobuffer;