【问题标题】:NodeJS splitting buffer by delimterNode JS 通过分隔符分割缓冲区
【发布时间】:2014-01-28 10:27:12
【问题描述】:

我在 NodeJS 中有一个基本的 TCP 服务器,它接收 JSON 字符串。一次可以是多个字符串(由\n 分隔)或单个字符串。

当我收到多个由\n 分隔的邮件时,就会出现问题。

我要做的是将缓冲区数据拆分为一个数组,然后遍历该数组以避免 JSON 解析错误。

这是我当前的代码:

var socketServer = net.createServer(function (socket) {

        // Handle incoming messages from agents.
        socket.on('data', function (data) {

                // Split the buffer so we dont get JSON parsing errors
                // Delimiter is \n
                var splitData = splitBuffer(data, "0x5c6e");

                for (var i = 0; i < splitData.length; i++) {

                    // Error arises here since there are multiple JSONs in the string
                    console.log(JSON.parse(splitData[i]));

                }

        });


});

function splitBuffer(buf, delimiter) {
  var arr = [], p = 0;

  for (var i = 0, l = buf.length; i < l; i++) {
    if (buf[i] !== delimiter) continue;
    if (i === 0) {
      p = 1;
      continue; // skip if it's at the start of buffer
    }
    arr.push(buf.slice(p, i));
    p = i + 1;
  }

  // add final part
  if (p < l) {
    arr.push(buf.slice(p, l));
  }

  return arr;
}

由于某种原因,splitBuffer() 函数无法根据我的分隔符拆分缓冲区。

有什么想法我在这里做错了吗?

【问题讨论】:

  • 如果我正确理解你想要做什么,为什么不变成一个字符串而不是原始字节,并使用.split("\n") 字符串方法我想你会得到你想要的结果。跨度>
  • 这种方法可能不起作用,因为缓冲区可能太大(Error: Cannot create a string longer than 0x1fffffe8 characters)。这就是为什么我在谷歌上搜索了与提问者相同的问题。
  • iter-ops 模块具有split 运算符,可以轻松拆分任何可迭代对象。

标签: json node.js


【解决方案1】:

您是否考虑过使用 ascii 表示?使用 javascript 的 String.charCodeAt(index) 非常友好,它返回相应的 ascii 值。不完全是您正在寻找的东西,但也许它是您将来可以尝试或使用的东西。

var str = 'thing\n';

var buffer = new Buffer(str.length);
  for (var i = 0; i < str.length ; i++) {
    buffer[i] = str.charCodeAt(i);
    if(buffer[i] !== 10) {
        // 10 is \n in ascii
        // do whatever
        console.log(str[i] + ' ' + buffer[i])
    }
  }

// expected output
t 116
h 104
i 105
n 110
g 103

【讨论】:

    【解决方案2】:

    字符串表示可能会在带有Error: Cannot create a string longer than 0x1fffffe8 characters 的巨大缓冲区上失败。 (否则最好使用toString().split('\n')。另外,我不会到这里)

    function* splitBuffer(buffer, delim){
        let start = 0;
        while(true){
            let nxt = buffer.indexOf(delim, start);
            let chunk;
            if(nxt == -1){
                chunk = buffer.slice(start);
                yield chunk;
                break;
            } else {
                chunk = buffer.slice(start, nxt);
                yield chunk;
            }
            start = nxt+1;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-22
      • 2012-07-31
      • 2012-12-01
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多