我正在使用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