从Javascript默认字符串编码构建一个UCS-2编码的HEX字符串



如何从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的使用更新为使用constlet):

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">

要获得十六进制表示,有几个选项:

  1. 使用Uint16Array实例查看buf,这样您就不需要关心平台的字节顺序:

    function uint16Array2hex(array) {
    return Array.from(array, (b) => b.toString(16).padStart(4, "0")).join("");
    }
    
  2. 更新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("");
    }
    
  3. 保持Chrome Developers的str2ab原样,然后通过使用Uint16Arraybuf读取并使用DataView写入缓冲区,将平台端序转换为big端序,如上所述。

最新更新