Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 节点:如何发送16位二进制信息_C_Node.js_Sockets_Buffer - Fatal编程技术网

C 节点:如何发送16位二进制信息

C 节点:如何发送16位二进制信息,c,node.js,sockets,buffer,C,Node.js,Sockets,Buffer,我有一个从套接字读取二进制命令的服务器程序。发送到套接字的缓冲区需要对其数据进行非常明确的排序。这是所提供的示例客户端应用程序中的一些C代码,它显示了需要发送的数据的顺序和大小 typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; typedef struct JobNodeInfo_s { u16 jNodeInfoType;

我有一个从套接字读取二进制命令的服务器程序。发送到套接字的缓冲区需要对其数据进行非常明确的排序。这是所提供的示例客户端应用程序中的一些C代码,它显示了需要发送的数据的顺序和大小

typedef   unsigned char     u8;
typedef   unsigned short    u16;
typedef   unsigned int      u32;

typedef struct JobNodeInfo_s {
    u16  jNodeInfoType;                          /* per END device, per router, whole system */
    u8  value[32];        /* mac address / barcode value / Location  */
} JobNodeInfo_t;

typedef struct JobHdrFormat_s {
    u16                 jPreamble;
    JobCommandType_t    jCmd;
    u16                 jBatchID;       /* for logging */
    u16                 jSeq;
    u16                 priority;
    u16                 option;         /* option field could be reserved for future extension */
    JobNodeInfo_t       jNodeInfo;
    u16                 jLen;

} JobHdrFormat_t;
JobHdrFormat_s结构作为指向套接字的空指针传递:

send(connfd, (void*)jFormat, sizeof(JobHdrFormat_t) + jFormat->jLen , 0);
现在,我需要在Node.js中复制这个缓冲区。我研究过节点缓冲区类,但注意到它只支持八位字节。如您所见,大多数内存插槽都是为16位整数保留的。是否可以按照我所需的方式来安排数据Is Node.js,如下面的C代码?我在这里做了第一次尝试:

var net = require( 'net' );
var client = new net.Socket();
client.connect( 13929, '192.168.2.2', function() {
    var mac_addr = "041511000960",
        outgoing_str = "FE9C00020000001100000004"
            + mac_addr
            + "0000",
        outgoing_buf = new Buffer( outgoing_str.length, "hex" );
var new_buff_arr = [];
for ( var i = 0, il = outgoing_str.length; i < il; i += 2 ) {
    var cmd_substr = "0x" + outgoing_str.substring( i, i + 2 ),
        i_cmd_substr = parseInt( cmd_substr );
        console.log( "substr: " + cmd_substr + " int: " +  i_cmd_substr );
        new_buff_arr.push(i_cmd_substr);
}
const buf = new Buffer(new_buff_arr);
    client.write( buf ,
        function() {
            console.log( "data is written" );
        }
    );
});

client.on('data', function( data ) {
    console.log('Received: ' + data.toString( "hex" ));
});

client.on('close', function() {
    console.log( 'Connection closed' );
});
var-net=require('net');
var client=new net.Socket();
client.connect(13929,'192.168.2.2',function(){
var mac_addr=“041511000960”,
传出_str=“fe9c0002000000010000004”
+麦加
+ "0000",
传出缓冲区=新缓冲区(传出缓冲区长度,“十六进制”);
var new_buff_arr=[];
对于(var i=0,il=outgoing_str.length;i
或多或少,我尝试将缓冲区写成一个字符串,循环遍历,将每两个“字节”写成一个十六进制值,然后将它们转换回数字并写出缓冲区。如果Node只能与八位字节一起工作,是否有任何可能?如果你需要更多的信息,请告诉我

看看:

[jBinary]是一个用于在JavaScript中处理二进制数据的库,允许使用当前浏览器或Node.js上自动检测到的最佳支持方式从任何源加载数据

然后再看看

我没有使用jBinary和Node.js的经验。但是我对这些特性很感兴趣,我现在已经找到了这个解决方案