Я пишу обёртку 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