我有一个服务器程序,它从套接字读取二进制命令。发送到套接字的缓冲区需要非常具体地对其数据进行排序。这是来自提供的示例客户端应用程序的一些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 结构作为void指针传递给套接字:
send(connfd, (void*)jFormat, sizeof(JobHdrFormat_t) + jFormat->jLen , 0);
现在,我需要在Node.js中复制这个缓冲区。我查看了Node Buffer类,但发现它只支持Octets。如您所见,大多数内存插槽都保留用于16位整数。有可能像我这样的C代码那样安排数据是Node.js吗?我在这里拍了第一眼:
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' );
});
或多或少我试图将缓冲区写为字符串,循环遍历它,将每两个'字节'写为单个十六进制值,然后将它们转换回数字并写出缓冲区。如果Node只能与八位字节一起使用,那么这有可能吗?如果您需要更多信息,请与我们联系。
答案 0 :(得分:0)
查看this:
[] jBinary [是]用于在JavaScript中处理二进制数据的库,允许从当前浏览器或Node.js上自动检测到最佳支持方式的任何源加载数据
然后再看jBinary library Typesets ......
我没有使用jBinary和Node.js的经验。但是我对这些功能很感兴趣,而且我现在已经找到了这个解决方案。