通过Node FFI从Node JS访问C ++应用程序-读取一些字节数据并将其写入文件

时间:2019-06-24 06:17:20

标签: c++ node.js node-ffi

我正在使用NODE-FFI编写C ++程序的Node JS包装器。我没有访问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包装器代码。它已经从NODE-FFI调用DLL。它创建文件,但文件中不包含任何数据

/* 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引用模块-https://github.com/TooTallNate/ref

更新

我将日志记录添加到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

0 个答案:

没有答案