ffi-napi调用dll返回ascii编码形式中文处理

525 阅读1分钟

前言

最近又一个项目,需要用到electron调用dll文件,经过多方查阅,最终选用了ffi-napi这个库进行调用,至于如何使用此库不过多叙述。

中文BUG

本次调用Dll的过程中,因为dll返回ascii编码,正常调用方式一直乱码,iconv-lite这个库我也用了,但是还是没有效果。

234db6d8cd614f26c6050052e31689b.jpg

并且根据 掘金大佬写的这个文章 得知

image.png

中文的占用字节比英文大,虽然我用python写的样例并没有出现此问题。

后经多方查阅,发现ffi可以自定义类型。参考文档

根据文章我尝试自己定义了一个类型,但是此时我还是有点弄不明白下面代码中的 indirection 的含义。我自己理解为库自动处理数据文件。 indirection是1的时候,自动处理,不是1的时候,不自动处理。 定义一个超大的size来储存数据。

let len = ref.sizeof.pointer * 1000;
let chinese = {
  name: 'chinese',
  indirection: 2,
  size: len,
};

下面直接贴代码

let arr = []
let len = ref.sizeof.pointer * 1000;
let chinese = {
  name: 'chinese',
  indirection: 2,
  size: len,
};
// 读取信息回调
let addCallback = ffi.Callback('void', [chinese, ref.types.int32,ref.types.int32], (item, index,c) => {
  // console.log(item,index,c);
  let s = []
  let data;
  for(let i=0; i<len ; i++ ){
    // console.log( item[i])
    s.push(item[i])
    data = iconv.decode(s, 'GBK')
    if(data.includes('\0\x00')){
      break
    }
  }
  // 最后一位为 \x00 ,需要截取掉
  data = data.slice(0, data.length - 1)
  arr.push(JSON.parse(data))

});
dll.rtscaleUploadPluData(0,addCallback);
console.log(arr)

虽然到现在,成功解决了此问题,但是我还是感觉这个实现方式不太对,也没弄明白。欢迎各位大佬批评指正。