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[]),推荐以下两种可行方案:
- 直接传递
Uint8Array(最优)TextEncoder.encode()返回的Uint8Array是标准的字节数组类型,多数NFC库都能直接识别,且能避免普通数组的JSON序列化问题:
const encoder = new TextEncoder(); const typeBytes = encoder.encode("text/vcard"); const record = this.ndef.record(tnf, typeBytes, [], payload);
- 转为合规的
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
相关产品推荐
相关产品推荐

