2011-05-18 29 views
3

我正在使用node.js构建一个tcp服务器,并且我想从接收到的数据中提取整数。从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数字?

+0

是不是ascii每字符1字节?在这种情况下,你不能只使用'pkgDataContent.charCodeAt(0)'? – Alxandr 2011-05-18 01:41:33

+1

http://stackoverflow.com/questions/1240408/reading-bytes-from-a-javascript-string可能会帮助 – Rasika 2011-05-18 01:48:40

+0

你确定你的示例代码是正确的吗?你似乎添加了两个'数据'听众,当一个人就足够了,你错过了一个'})'。 – 2011-05-18 01:50:13

回答

4

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

大端32位无符号整数:

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

小尾数32位无符号整数:

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

这可能有所帮助:http://blog.vjeux.com/2011/javascript/jdataview-read-binary-file.html – 2011-05-19 01:36:56

3

在你的函数传递的 '数据' 是缓冲对象。它可以包含任何二进制数据。 假设接收到的分组是普通的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字节后的剩余数据,可以使用偏移量。

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

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

[little endian系统]

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

[大端系统]

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

也请参阅本:

https://github.com/jeremyko/nodeChatServer

希望这有助于。