You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js中从WebSocket接收二进制数据并转换为字符串?

问题分析与解决方案

刚好碰到过类似的问题,我来给你一步步拆解解决方案~你遇到的核心问题是两种二进制数据类型(ArrayBuffer和Buffer)的处理逻辑不同,而且第二种情况返回的Buffer明显是gzip压缩格式的,直接转字符串肯定会乱码。下面分场景给你具体的解决方法:

1. 当设置binaryType = 'arraybuffer'时转字符串

ArrayBuffer本身没有内置的字符串转换方法,直接调用toString()只会返回对象的类型描述。你需要用Node.js/浏览器提供的TextDecoder来完成解码:

const ws = new WebSocket(url);
ws.binaryType = 'arraybuffer';

ws.on('message', function(body) {
  // 根据实际数据的编码调整参数,比如'gbk'、'utf-16'等,默认是utf-8
  const decoder = new TextDecoder('utf-8');
  const decodedText = decoder.decode(body);
  console.log('解码后的字符串:', decodedText);
});

2. 默认BinaryType(Buffer)时处理压缩数据

从你输出的Buffer开头1f 8b可以判断,这是gzip压缩格式的标志性魔数,所以必须先解压再转字符串。Node.js内置的zlib模块就能搞定这个:

const zlib = require('zlib');
const ws = new WebSocket(url);

ws.on('message', function(body) {
  // 先判断是否是gzip压缩数据
  if (body[0] === 0x1f && body[1] === 0x8b) {
    zlib.gunzip(body, (err, decompressedBuffer) => {
      if (err) {
        console.error('gzip解压失败:', err);
        return;
      }
      // 解压后转成字符串,注意和后端返回的编码保持一致
      const text = decompressedBuffer.toString('utf-8');
      console.log('解压并解码后的字符串:', text);
    });
  } else {
    // 如果数据没有压缩,直接转字符串即可
    const text = body.toString('utf-8');
    console.log('解码后的字符串:', text);
  }
});

额外注意事项

  • 编码匹配很重要:如果后端返回的是GBK等非UTF8编码,你需要安装iconv-lite模块来支持解码,比如iconv.decode(body, 'gbk')。
  • 其他压缩格式适配:如果是deflate压缩,要替换成zlib.inflate()方法来解压。

内容的提问来源于stack exchange,提问作者Winner Just

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:00:44