Извлечение целого числа из потока TCP - PullRequest
3 голосов
/ 18 мая 2011

Я использую 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 байта.Как извлечь эти 1-байтовые, 2-байтовые и 4-байтовые целые числа из строки JavaScript?Как и в приведенном выше коде: pkgDataContent представляет собой строку из 2 байтов, но на самом деле это целое число, как правильно преобразовать его в число javascript?

Ответы [ 2 ]

4 голосов
/ 18 мая 2011

Зависит от порядкового номера и от того, подписано оно или нет.

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)
3 голосов
/ 28 декабря 2012

Данные, передаваемые в вашей функции, являются объектом Buffer. он может содержать любые двоичные данные. Предположим, что полученный пакет - это простая структура c, подобная этой,

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

тогда первые 2 байта данных являются двоичными данными. и вы можете получить целое число методом Буфера.

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 использовать? это зависит от того, какой порядковый номер использует ваш компьютер.

[система с прямым порядком байтов]

  • Linux на x86, x64, Alpha и Itanium
  • Mac OS X на x86, x64
  • OpenVMS на VAX, Alpha и Itanium
  • Solaris на x86, x64, PowerPC
  • Tru64 UNIX на Alpha
  • Windows на x86, x64 и Itanium

[система с прямым порядком байтов]

  • AIX on POWER
  • AmigaOS на PowerPC и 680x0
  • HP-UX на Itanium и PA-RISC
  • Linux на MIPS, SPARC, PA-RISC, POWER, PowerPC, 680x0, ESA / 390 и г / Архитектура
  • Mac OS на PowerPC и 680x0
  • Mac OS X на PowerPC
  • MVS и DOS / VSE на ESA / 390, а также z / VSE и z / OS на z / Architecture
  • Солярис на SPARC

Также обращайтесь к этому:

https://github.com/jeremyko/nodeChatServer

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...