You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java String.getBytes()的TS/JS等价实现及NdefRecord适配问题

Java转TypeScript实现NdefRecord的字节数组问题

原Java代码:

NdefRecord record = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "text/vcard".getBytes(), new byte[] {}, messagebytes);

TypeScript中NdefRecord的参数定义为:

(tnf: number, type: string | number[], id: string | number[], payload: string | number[])

我尝试了几种替代Java中getBytes()的实现:

var vcard= `BEGIN:VCARD\nVERSION:2.1\nN:;${firstName}\nORG: ${org}\nEMAIL:${email}\nEND:VCARD`;
var payload = this.nfc.stringToBytes(vcard)
var encoder = new TextEncoder();
var array = Array.from(encoder.encode("text/vcard"))

并测试了三种调用方式:
1.

record = this.ndef.record(tnf, array, [], payload); 
record = this.ndef.record(tnf, encoder.encode("text/vcard").toString(), [], payload);
record = this.ndef.record(tnf, this.nfc.stringToBytes("text/vcard"), [], payload); 

遇到的问题:

  • 第1、3种方式触发JSON错误
  • 第2种方式返回的是vcard字符串,不符合预期

请问如何正确获取"text/vcard"的字节数组?


解决方案

核心问题分析

你遇到的JSON错误,本质是传递的字节数组类型不被库的序列化逻辑兼容;第2种方式用toString()会把Uint8Array转成逗号分隔的字符串,完全不符合MIME类型的字节要求,所以结果错误。

正确实现方式

根据大多数NFC TS库的实际行为(尽管参数标注为number[]),推荐以下两种可行方案:

  1. 直接传递Uint8Array(最优)
    TextEncoder.encode()返回的Uint8Array是标准的字节数组类型,多数NFC库都能直接识别,且能避免普通数组的JSON序列化问题:
const encoder = new TextEncoder();
const typeBytes = encoder.encode("text/vcard");
const record = this.ndef.record(tnf, typeBytes, [], payload);
  1. 转为合规的number[](兼容严格要求的库)
    如果库强制要求普通number[],需确保数组元素是0-255的合法字节值(避免溢出):
const encoder = new TextEncoder();
const typeBytes = Array.from(encoder.encode("text/vcard")).map(b => b & 0xFF);
const record = this.ndef.record(tnf, typeBytes, [], payload);

为什么之前的方式失败?

  • 第1、3种方式:普通number[]可能被库的JSON序列化逻辑误处理(比如某些库仅支持TypedArray的序列化),或者stringToBytes返回的数组包含非法值。
  • 第2种方式:Uint8Array.toString()会生成类似"116,101,120,..."的字符串,完全不是MIME类型的字节数组,自然无法正确生成NDEF记录。

内容的提问来源于stack exchange,提问作者Rawan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:43:18