js websocket收到的数据用hex方式显示

2024-3-28 / 0 评论 / 116247 阅读
温馨提示:
本文最后更新于 2024-3-28,已超过一年没有更新,但放心,本站内容和图片永久不会失效。

在JavaScript中,如果你想要将WebSocket接收到的数据以十六进制(hex)方式显示,你需要先将接收到的数据(通常是ArrayBuffer或Blob)转换为十六进制字符串。下面是一个示例,展示了如何做到这一点:

const socket = new WebSocket("ws://your-websocket-url");  

socket.onmessage = function(event) {  
    // event.data 可能是 ArrayBuffer 或者 Blob,或者是直接的字符串(取决于发送的数据类型)  
    // 如果 event.data 是 ArrayBuffer 或者 Blob,我们需要转换为十六进制字符串  
    let hexString;  
    if (event.data instanceof ArrayBuffer || event.data instanceof Blob) {  
        const arrayBuffer = event.data instanceof Blob ? event.data.arrayBuffer() : event.data;  
        const uint8Array = new Uint8Array(arrayBuffer);  
        hexString = Array.from(uint8Array).map(b => ('00' + b.toString(16)).slice(-2)).join('');  
    } else if (typeof event.data === 'string') {  
        // 如果直接接收到字符串,这里可以转换为UTF-8的十六进制表示(如果需要)  
        hexString = [...event.data].map(c => c.charCodeAt(0).toString(16).padStart(2, '0')).join('');  
    } else {  
        // 处理其他数据类型...  
        hexString = 'Unknown data type';  
    }  

    console.log('Received in hex:', hexString);  
};  

socket.onerror = function(error) {  
    console.error('WebSocket Error:', error);  
};  

socket.onclose = function(event) {  
    console.log('WebSocket is closed.', event.reason);  
};

在这个示例中,我们首先检查event.data的类型。如果它是ArrayBuffer或Blob,我们将其转换为一个Uint8Array,然后遍历这个数组,将每个字节转换为十六进制字符串,并使用map和join方法将它们连接成一个单一的十六进制字符串。如果event.data是一个字符串,我们可以使用charCodeAt方法获取每个字符的UTF-16编码,并将其转换为十六进制字符串。

请注意,对于字符串的十六进制表示,上面的代码将字符串的每个字符(UTF-16编码)转换为十六进制。如果你想要将字符串的字节(UTF-8编码)转换为十六进制,你需要使用不同的方法,因为JavaScript字符串是基于UTF-16编码的。你可能需要先将字符串转换为UTF-8编码的Uint8Array,然后再进行十六进制转换。这通常涉及到编码库的使用,例如TextEncoder(在现代浏览器中可用)。

if (typeof TextEncoder !== 'undefined') {  
    const encoder = new TextEncoder(); // 创建TextEncoder实例  
    const uint8Array = encoder.encode(event.data); // 将字符串编码为UTF-8的Uint8Array  
    hexString = Array.from(uint8Array).map(b => ('00' + b.toString(16)).slice(-2)).join('');  
} else {  
    // 浏览器不支持TextEncoder,可能需要使用polyfill或其他方法  
}

确保你的环境支持TextEncoder,或者如果不支持,则使用polyfill或其他库来处理字符串到UTF-8字节的转换。


扫描二维码,在手机上阅读

评论一下?

OωO
取消
友情链接

纸上世界无尘埃,心随墨迹飞天外 (● ̄(エ) ̄●)