在 NODeJS 中的 TCP 套接字上将十六进制字节转换为十进制

Posted

技术标签:

【中文标题】在 NODeJS 中的 TCP 套接字上将十六进制字节转换为十进制【英文标题】:Convert Hex bytes to Decimal receving on TCP Socket in NODeJS 【发布时间】:2021-09-21 13:37:21 【问题描述】:

我正在接收 000F313233343536373839303132333435 作为我的 tcp 套接字上的字节,并希望将其转换为 123456789012345 我想将套接字上接收的这个字节流解析为数字。

function onConnect(socket) 
    socket.setEncoding('utf8');//Socket data to utf8 format
    
    socket.on('data', function (data)  //Socket event when data is sent from tcp client
    var buffer = Buffer.from(data,"hex");

        let clientport=socket.remotePort;
        let clientadd=socket.remoteAddress;
        console.log(clientadd+":"+clientport)

        console.log("--",data,"--")

        
        console.log(buffer);
        var msg = buffer.toString()
        var msglength = msg.length;
        console.log(msglength);
        

        
    )//<=on data

【问题讨论】:

【参考方案1】:

如果您知道您的号码始终适合Number.MAX_SAFE_INTEGER,您可以使用简单的Number 转换:

const HEADER_LEN = 2;

const src = Buffer.from('000F313233343536373839303132333435', 'hex');

const len = src.readUInt16BE();
const hex = src.toString('utf8', HEADER_LEN, HEADER_LEN + len); // skip first 2 header bytes

console.log(Number(hex)); // 123456789012345

或者BigInt,如果它可以是任意长度的整数:

const bigSrc = Buffer.from(
  '002D313233343536373839303132333435313233343536373839303132333435313233343536373839303132333435',
  'hex'
);

const bigLen = bigSrc.readUInt16BE();
const bigStr = bigSrc.toString('utf8', HEADER_LEN, HEADER_LEN + bigLen); // skip first 2 header bytes

console.log(BigInt(bigStr)); // 123456789012345123456789012345123456789012345n

stackblitz link

【讨论】:

我可以使用上面给出的解决方案来解析来自 tcp 端口的任何类型的十六进制字节吗? 我不确定任何类型,但只要它们符合给定的方案,它应该可以工作。

以上是关于在 NODeJS 中的 TCP 套接字上将十六进制字节转换为十进制的主要内容,如果未能解决你的问题,请参考以下文章

如何在jmeter tcp采样器中发送多个十六进制数据有效负载?

通过 tcp 套接字发送十六进制值

Nodejs 随机免费 tcp 端口

NodeJS - TCP - 发送 HTTP 请求

如何找到 TCP 套接字的 inode?

nodejs fs 读取文件流一次读取多少数据