Доступ к приложению C ++ из Node JS через Node FFI - чтение некоторых данных в байтах и ​​запись их в файл - PullRequest
0 голосов
/ 24 июня 2019

Я пишу обёртку Node JS для программы на C ++, используя NODE-FFI. У меня нет доступа к источнику C ++, и он находится в форме DLL.

Существует метод чтения некоторых данных до их завершения и записи в файл.

Вот как существующая оболочка C # выполняет эту задачу, вызывая DLL и записывая в файл с использованием потоков.

FileStream sw = new FileStream(fileName.pdf, FileMode.Create);

/* appHandle, fileHandle, buffer are pointers in the C++ program*/
while(Wrapper.readVirtualFile(appHandle, fileHandle, buffer, 1000) > 0){

    /* get length of the data */
    int len = (int)Wrapper.getSize(buffer);

    /* read data to the byte array */
    byte[] data = Wrapper.getData(buffer).ReadBytes(len);

    sw.Write(data, 0, len);
}

sw.Close();

Так выглядит метод ReadBytes .

public static byte[] ReadBytes(this IntPtr ptr, int len){

    byte[] array = new byte[len];

    Marshal.Copy(ptr, array, 0, len);

    return array;
}

Это код оболочки NODE JS . Это уже вызывает DLL из NODE-FFI. Он создает файл , но не содержит никаких данных в файле .

/* Create stream in NodeJS. I want the file in **pdf format** */
const wstream = fs.createWriteStream(fileName.pdf);

/* appHandle, fileHandle, buffer are pointers in the C++ program */
while(NodeWrapper.readVirtualFile(appHandle, fileHandle, buffer, 1000) > 0){

    /* get length of the data */
    const len = NodeWrapper.getSize(buffer);
    console.log('length:', len);

    /* get the memory address of the data */
    const dataPtr = NodeWrapper.getData(buffer);
    console.log('dataPtr:', dataPtr);

    /* I am using NodeJS ref module to read the data */
    const data = ref.readCString(dataPtr);
    console.log('data:', data);

    wstream.write(data);
}

wstream.end();

Использование ref.readCString мне кажется неправильным. Каковы возможные решения для этого?

Узел FFI - https://github.com/node-ffi/node-ffi

NodeJS ref module - https://github.com/TooTallNate/ref

UPDATE

Я добавил логирование в приложение NodeJs. Регистрация результатов выглядит следующим образом (только пример, поскольку журнал довольно длинный).

len:  1000

dataPtr: <Buffer@0x0000024F7E5F9420 0a 65 6e 64>

data: endobj 53 0 obj[638.9 638.9 958.3 958.3 319.4 351.4 575 575 575 
575 575 869.4 511.1 597.2 830.6 894.4 575 1041.7 1169.4 894.4 319.4 
350 602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 
383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 
350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 
900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 
800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 
319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 
319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 
606.9 606.9]
endobj
54 0 obj
[583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 
444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 
833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 
500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 
777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 
625 916.7 750


len:  1000

dataPtr: <Buffer@0x0000024F7E5F9420 20 37 37 37>

data:  777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 
611.1 
277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 
555.6 277.8 305.6
527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 
722.2 527.8 527.8 444.4 500 1000]
endobj
...