从tcp流中提取整数

时间:2011-05-18 01:38:45

标签: javascript tcp node.js

我正在使用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数?

2 个答案:

答案 0 :(得分:4)

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

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)

答案 1 :(得分:3)

您的函数中传递的'data'是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  );

使用哪个endian?这取决于您的计算机使用哪个端点。

[小端系统]

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

[big-endian system]

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

也请参考:

https://github.com/jeremyko/nodeChatServer

希望得到这个帮助。