我来自
node.js最快的将十六进制字符串解码为utf-16的方法
十六进制字符串48 00 65 00 6c 00 6c 00 6f 00 20 00 16 4e 4c 75在utf16le下解码为"Hello 世界"
你有一个十六进制字符串:
00 48 00 65 00 6C 00 6C 00 6F 00 20 4E 16 75 4C
让我们来比较一下两个字符串:
48 00 65 00 6c 00 6c 00 6f 00 20 00 16 4e 4c 75
解码为 utf16
le 是 'Hello 世界'
00 48 00 65 00 6C 00 6C 00 6F 00 20 4E 16 75 4C
解码为 utf16
be 是 'Hello 世界'
唯一的区别是每两个字节被交换了顺序
而且不仅仅是每两个字节,它们的字节顺序也是相反的
你要么手动翻转字节顺序,要么使用函数.toString('utf16be')
be
:大端字节序是le
:小端字节序的相反
但是node.js不提供buf.toString('utf16be')
要手动“反转字节顺序”,可以使用:buf.swap16()
https://nodejs.org/api/buffer.html#buffer_buf_swap16
buf.swap16() 的一个方便用途是在 UTF-16 小端和 UTF-16 大端之间执行快速的原地转换:
const myHexStr = '00 48 00 65 00 6C 00 6C 00 6F 00 20 4E 16 75 4C'
const removedSpaces = myHexStr.replace(/ /g,'')
const buf = Buffer.from(removedSpaces,'hex')
const reversedBuf = buf.swap16()
const backToJavascriptString = reversedBuf.toString("utf16le")
这可以简化为一行代码:
Buffer.from('00 48 00 65 00 6C 00 6C 00 6F 00 20 4E 16 75 4C'.replace(/ /g,''),'hex').swap16().toString("utf16le")
这是一种更好的方法(性能方面):
值得庆幸的是,node.js至少提供了一个函数以大端字节序读取:
buf.readUInt16BE()
但它一次只能读取2个字节。你猜还有什么也是2个字节?
UTF-16
我的实现:
将所有这些readUInt16BE推送到固定长度的数组中
function ubeFunc(hexx4) {
const buf = Buffer.from(hexx4, "hex"), len = buf.length/2, arr = new Array(len)
for (let i = 0; i < len; i++) {
arr[i]=buf.readUInt16BE(i*2)
}
return String.fromCharCode(...arr)
}
如何使用它。
ubeFunc('00 48 00 65 00 6C 00 6C 00 6F 00 20 4E 16 75 4C'.replace(/ /g,''))
这是最快的方法:在这里阅读:node.js将十六进制字符串解码为utf-16的最快方法