Как передать javascript Buffer в C программу или NAPI? - PullRequest
0 голосов
/ 09 января 2020

У меня есть JavaScript, в котором я создал буфер . Я читаю файл и сохраняю данные файла в буфере. Я должен передать данные буфера в программу NAPI / c. Я создал модуль узла. для использования буфера JavaScript в программе c / NAPI мне нужно * uint8_t. Я пытался использовать функцию napi_get_buffer_info для получения Javascript сведений о буфере и данных. Я могу получить длину буфера JavaScript для программы NAPI / c. Пример кода
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)

Вопрос:
1) Как я могу получить указатель (* uint8_t) буфера Javascript и перейти к функции c?
2) Как я могу распечатать данные буфера JavaScript в программе c?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...