从 TCP 流中提取整数

发布于 2024-11-07 17:39:30 字数 463 浏览 0 评论 0原文

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

I am using node.js to build a tcp server, and I want to extract integers from the data received.

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");

The data received is string type, and the numbers are 1 byte, 2 bytes and 4 bytes. How to extract these 1-byte, 2-byte and 4-byte integers from a javascript string? Like the code above: pkgDataContent is a string of 2 bytes, but actually it is an integer, how to convert it to javascript number correctly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

幸福丶如此 2024-11-14 17:39:30

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

大端 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)

Depends on endianness and on whether it's signed or not.

big endian 32-bit unsigned integer:

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

little endian 32-bit unsigned integer:

pkgDataContent.charCodeAt(3) << (8*0) +
pkgDataContent.charCodeAt(2) << (8*1) +
pkgDataContent.charCodeAt(1) << (8*2) +
pkgDataContent.charCodeAt(0) << (8*3)
半葬歌 2024-11-14 17:39:30

函数中传递的“数据”是 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  );

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

[little-endian 系统]

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

[big-endian 系统]

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

也请参阅此:

https://github.com/jeremyko/nodeChatServer

希望有所帮助。

The 'data' passed in your function is Buffer object. it can contain any binary data.
Suppose that a received packet is the plain c structure like this,

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

then the first 2 byte of data is binary data. and you can get the integer by Buffer's method.

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

To get the rest data after 2 bytes, you can use offset.

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

which endian to use? it depends on which endian your computer use.

[little-endian system]

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

[big-endian system]

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

also please refer to this:

https://github.com/jeremyko/nodeChatServer

Hope this help.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文