【问题标题】:Extract integer from a tcp stream从 tcp 流中提取整数
【发布时间】:2011-08-27 16:41:22
【问题描述】:

我正在使用node.js构建一个tcp服务器,我想从接收到的数据中提取整数。

var net = require('net');
var server = net.createServer(function (socket) {
  socket.setEncoding('ascii');
  socket.addListener("data", function (data) {
    var pkgDataContent = data.substr(0, 2);
  });
});
server.listen(1337, "192.168.80.91");

接收到的数据为字符串类型,数字为1字节、2字节和4字节。如何从 javascript 字符串中提取这些 1 字节、2 字节和 4 字节整数?如上面的代码:pkgDataContent是一个2字节的字符串,但实际上是一个整数,如何正确转换成javascript数字?

【问题讨论】:

  • 每个字符不是 ascii 1 字节吗?那样的话,你就不能用pkgDataContent.charCodeAt(0)吗?
  • 您确定您的示例代码正确吗?当一个就足够了并且您缺少一个“})”时,您似乎添加了两个“数据”侦听器。
  • 如果数据以一、二或四字节整数开头,您如何区分它们?值是否以某种方式分隔?
  • @Rob Raisch,感谢您指出错误,我已更正。该流具有精确的格式,因此可以使用约定提取整数。

标签: javascript tcp node.js


【解决方案1】:

取决于字节顺序以及是否已签名。

big endian 32 位无符号整数:

pkgDataContent.charCodeAt(0) << (8*3) +
pkgDataContent.charCodeAt(1) << (8*2) +
pkgDataContent.charCodeAt(2) << (8*1) +
pkgDataContent.charCodeAt(3) << (8*0)

little endian 32 位无符号整数:

pkgDataContent.charCodeAt(3) << (8*0) +
pkgDataContent.charCodeAt(2) << (8*1) +
pkgDataContent.charCodeAt(1) << (8*2) +
pkgDataContent.charCodeAt(0) << (8*3)

【讨论】:

【解决方案2】:

函数中传递的“数据”是 Buffer 对象。它可以包含任何二进制数据。 假设接收到的数据包是这样的普通 c 结构,

typedef struct _SOME_PACKET
{
    unsigned short nLen; //2byte
    char szSomeMSg [16];    
} SOME_PACKET;

那么前2个字节的数据就是二进制数据。并且可以通过Buffer的方法获取整数。

var littleEndianInt = data.readUInt16LE(0); 
//or
var bigEndianInt    = data.readUInt16BE(0);

要获取2个字节后的剩余数据,可以使用offset。

var restOfDataExceptInt = new Buffer( data.length - 2 ); 
restOfDataExceptInt.fill();
data.copy( restOfDataExceptInt, 0, 2, data.length  );

使用哪个字节序?这取决于您的计算机使用哪个字节序。

[小端系统]

  • Linux on x86、x64、Alpha 和 Itanium
  • x86、x64 上的 Mac OS X
  • 在 VAX、Alpha 和 Itanium 上的 OpenVMS
  • x86、x64、PowerPC 上的 Solaris
  • Tru64 UNIX on Alpha
  • x86、x64 和 Itanium 上的 Windows

[大端系统]

  • AIX on POWER
  • PowerPC 和 680x0 上的 AmigaOS
  • 安腾和 PA-RISC 上的 HP-UX
  • Linux on MIPS、SPARC、PA-RISC、POWER、PowerPC、680x0、ESA/390 和 z/架构
  • PowerPC 和 680x0 上的 Mac OS
  • PowerPC 上的 Mac OS X
  • ESA/390 上的 MVS 和 DOS/VSE,以及 z/Architecture 上的 z/VSE 和 z/OS
  • SPARC 上的 Solaris

也请参考:

https://github.com/jeremyko/nodeChatServer

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多