Node.js数据转Java的byte类型

作者 Hpyer 日期 2022-03-04
Node.js数据转Java的byte类型

引子

最近在做一个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);

// 注:Int8Array.from() 返回的是 Int8Array 类型的对象
// 再用 Array.from() 转换为普通数组
let bytes = Array.from(Int8Array.from(buffer));
console.log('bytes', bytes);