C与node对于经UDP协议传输的Buffer数据的处理问题
发布于 8 年前 作者 MaskWu 4506 次浏览 来自 问答

补充:目前的想法是对buffer进行一个struct的处理,读出对应的数据,但是目前尝试了c-struct和struct,读出的数据有错误,各位有比较好的包推荐吗

遇到的问题是一台设备经UDP协议向服务器发送buffer类型的数据,本人使用的是nodejs,在对接受的buffer数据进行转string等操作时,无法获取到想要的数据,但是别人给的C的版本可以输出正常数据,但是本人学过的C基本忘完了,所以想请问下,对应的C操作,NODE需要进行什么样的操作,才能获取正常的数据 C语言的操作:

recvfrom(server_socket_fd, buffer, BUFFER_SIZE,0,(struct sockaddr*)&client_addr, &client_addr_length) //实现声明了一个buffer空间,函数接受到通过udp协议发送的数据之后存储到了buffer中
//对接受的数据进行处理
struct cliprobe_data {
        unsigned char Apmac[6];
        unsigned short int Vendorid;
        unsigned short int Reserved1;
        unsigned char Bssid[6];
        unsigned char Radiotype;
        unsigned char Channel;
        unsigned char Associated;
        unsigned char Messagetype;
        char Timestamp[14];
        unsigned short int Reserved2;
        unsigned char Mutype;
        unsigned short int Reserved3;
        char Rssi;
        unsigned short int Reserved4;
        unsigned char Noisefloor;
        unsigned short int Reserved5;
        unsigned char Datarate;
        unsigned char MPDUflags;
        unsigned char Mumac[6];
        unsigned short int Framecontrol;
        unsigned short int Sequencecontrol;
        unsigned short int Reserved6;
};
package_data = (struct cliprobe_data *) buffer;//相当于格式化了buffer?

Node的话,

serverSocket.on('message', function(msg, rinfo){
    console.log(msg)//buffer 类型
    console.log(msg.toString())//乱码
});
7 回复

写 c++/c addons ,用C ++ 程序完成数据传输,然后返回给node 就可以了,省心省事。。 都用struct 结构了,nodejs 本身是无法完成的。对,你还要自己转码呢。。。。

不知道你 toString 有什么意义呢? 你要做的是对着struct的声明,用 Buffer.readXXXX() 读取各个域就行了.

@myy thx,我试一下

@cnlile 自己不会C++,==

你可以把机器发送过来的buffer数据转换成由“16进制数”组成的字符串,然后再按设备提供的协议解析

function buffToStr(buff) {
	let hex_str = '';
	for (let i = 0; i < buff.length; i++)  {
		let val = buff[i].toString(16);
		if (val.length == 1) {
			val = '0' + val;
		}
		hex_str = hex_str + val;
	}
	return hex_str;
}

抓包,对比二进制,看是否有自定义报文格式这类的,需要解析的部分

回到顶部