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