如何从Javascript构建UCS-2编码的HEX字符串"基本的";字符串,但仅使用web api(浏览器或Deno)功能?
换句话说,如何转换以下节点代码,但对于浏览器来说?
message = "hello world "
const buf_le = Buffer.from(message, "ucs2"); // 'ucs2' is as same as 'utf16le'
let buf = Buffer.alloc(buf_le.length); // convert to utf16be (ucs2)
for (let i = 0; i < buf.length; i += 2)
buf.writeUInt16BE(buf_le.readUInt16LE(i), i);
hex = buf.toString("hex");
它将用于将文本编码为用于SMS发送的PDU。
谢谢!
您可以从如何将ArrayBuffer转换为字符串和从字符串转换为字符串-Chrome开发人员使用此解决方案(var
的使用更新为使用const
或let
):
function str2ab(str) {
const buf = new ArrayBuffer(str.length * 2); // 2 bytes for each char
const bufView = new Uint16Array(buf);
for (let i = 0, strLen = str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
它使用Uint16Array
作为ArrayBuffer
的视图">Uint16Array
类型的数组表示平台字节顺序的16位无符号整数的数组。如果需要控制字节顺序,请改用DataView
">
要获得十六进制表示,有几个选项:
使用
Uint16Array
实例查看buf
,这样您就不需要关心平台的字节顺序:function uint16Array2hex(array) { return Array.from(array, (b) => b.toString(16).padStart(4, "0")).join(""); }
更新
str2ab
以使用DataView
而不是Uint16Array
,这样您就可以直接写入网络字节顺序(big-endian):function str2ab(str) { const buf = new ArrayBuffer(str.length * 2); // 2 bytes for each char const bufView = new DataView(buf); for (let i = 0, strLen = str.length; i < strLen; i++) { bufView.setUint16(2 * i, str.charCodeAt(i)); } return buf; } function buf2hex(buf) { const bufView = new Uint8Array(buf); return Array.from(bufView, (b) => b.toString(16).padStart(2, "0")).join(""); }
保持Chrome Developers的
str2ab
原样,然后通过使用Uint16Array
从buf
读取并使用DataView
写入缓冲区,将平台端序转换为big端序,如上所述。