最近在做一个native开发安卓app的项目,需要将一个字符串转为gbk编码然后再转Java的 byte[] 后,再传过去。
起先是的做法,是调用
icon-lite
的 encode 方法,得到一个 Buffer,然后再自己写了个方法,遍历 Buffer 的数据,然后判断每个元素,大于 127 就通过
(~item) ^ 0xFF
转化,小于等于不变,然后得到一个新的数组,就是 Java 的 byte[]。代码类似:
const toJavaByte = function (data) { if ( Object.prototype.toString.call(data) == '[object Array]' || Buffer.isBuffer(data) ) { let bytes = []; data.forEach(item => { if (typeof item != 'number') { bytes.push(0); return; }
let byte = toJavaByte(item); if (Object.prototype.toString.call(byte) == '[object Array]') { bytes = bytes.concat(byte); } else { bytes.push(byte); } }); return bytes; } else if (typeof data != 'number') { return 0; }
if (data > 127) { return (~data) ^ 0xFF; }
return data; };
import iconv from 'iconv-lite'
let str = 'Test123中文'; console.log('str', str);
let buffer = iconv.encode(str, 'gbk'); console.log('buffer', buffer);
let bytes = toJavaByte(buffer); console.log('bytes', bytes);
|
上述代码一般情况下使用是没什么问题的,不过如果传入的是
Uint8Array
类型或者其他类型的数据,判断逻辑上就得做调整了。然后,最近发现了一个比较简便的方法,就是利用
Int8Array.from()
方法,就可以完成数据转换了。
import iconv from 'iconv-lite'
let str = 'Test123中文'; console.log('str', str);
let buffer = iconv.encode(str, 'gbk'); console.log('buffer', buffer);
let bytes = Array.from(Int8Array.from(buffer)); console.log('bytes', bytes);
|