收藏
回答

nfcA.transceive获取的结果ArrayBuffer解析成字符串乱码?

目标:手机nfc识别ic卡获取ic卡的信息;
问题:nfcA.transceive获取的结果ArrayBuffer解析成字符串乱码,用decodeURIComponent报错:url malformed
手机:华为p30,EMUI:11.0.0,安卓10
ps:使用名叫“nfc读写”的小程序识别卡片可以得到一个类似id的的信息,如AD2A04AF


代码如下:

const app = getApp();
var NFCAdapter = wx.getNFCAdapter();
Page({
  data: {
    id: ""
  },
  onShow() {
    NFCAdapter.startDiscovery({
      success: res => {
        this.init();
      },
      fail: error => {
        console.log(error)
      }
    })
  },
  str2ab(str) {
    var buf = new ArrayBuffer(str.length * 2);
    var bufView = new Uint16Array(buf);
    for (var i = 0, strLen = str.length; i < strLen; i++) {
      bufView[i] = str.charCodeAt(i);
    }
    return buf;
  },
  init() {
    NFCAdapter.onDiscovered(callback => {
      if (callback.techs.includes(NFCAdapter.tech.nfcA)) {
        const nfcA = NFCAdapter.getNfcA();
        app.nfcA = nfcA;
        nfcA.connect({
          success: res => {
            nfcA.transceive({
              data: this.str2ab('GET DATA'),
              success: res => {
                console.log(res.data) //打印结果 <ArrayBuffer:byteLength=16>
                let k = String.fromCharCode.apply(null, new Uint16Array(res.data));
                console.log(k) // k为乱码
                console.log(decodeURIComponent(escape(k))) // 这里报错:url malformed
              },
              fail: error => {
                console.log(error)
              }
            })
          }
        })
      }
    })
  },
})
回答关注问题邀请回答
收藏

3 个回答

  • 社区技术运营专员--许涛
    社区技术运营专员--许涛
    2021-08-25

    你好,请具体描述问题出现的流程,并提供能复现问题的简单代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)。

    2021-08-25
    有用
    回复 5
    • Great
      Great
      2021-08-26
      2021-08-26
      回复
    • Great
      Great
      2021-08-26
      就是转换普通的字符串,比如我的卡用“nfc读写”的小程序,识别出来一个字符串:“AD2A04AF,像这样我应该怎么解析?
      2021-08-26
      回复
    • Great
      Great
      2021-08-27回复社区技术运营专员--许涛
      这些方法我知道我也用了,现在问题是最终转换出来的字符串是乱码,上面你说乱码不代表有问题的话,请问是不是我nfcA.transceive里面的data传值有问题呢?这个data的值我查到的资料是把‘GET DATA’转成arraybuffer就可以拿到卡片的信息,我搜遍社区关于这个值的问题没有一个明确且正确的回答,麻烦能给个准确的值吗?
      2021-08-27
      回复
    • 社区技术运营专员--许涛
      社区技术运营专员--许涛
      2021-08-27回复Great
      1. 乱码不代表有问题背景是:字节数组 转成 字符串 乱码是可能的,具体如何转换,转换时编码格式不对显然就是会乱码
      2. arraybuffer to hex string,是把字节数组用十六进制的形式打出来,这不可能乱码
      3. transceive本身就是个裸写指令的接口,可能是写入的指令有误,也可能是读数据处理有误。
      4. 如果只是为了拿卡片id,onDiscovered的回调里有id字段
      2021-08-27
      回复
    • Great
      Great
      2021-08-27回复社区技术运营专员--许涛
      好的,感谢回答,🙏
      2021-08-27
      回复
  • 💫
    💫
    2023-01-12

    所以“<ArrayBuffer:byteLength=16>” 这个是字符串的问题好像并没有被解决呢

    2023-01-12
    有用
    回复
  • Great
    Great
    2021-08-26
    代码片段:
    


    https://developers.weixin.qq.com/s/Sk6v2Qmm7KsK

    2021-08-26
    有用
    回复
登录 后发表内容