我正在使用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数?
答案 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?这取决于您的计算机使用哪个端点。
[小端系统]
[big-endian system]
也请参考:
https://github.com/jeremyko/nodeChatServer
希望得到这个帮助。