NodeJ 以丑陋的二进制格式接收 UDP 数字
NodeJs receive UDP numbers in ugly binary format
我对node.js
一无所知。
在我之前关于如何发送带有C++
的字符串文本并从Node.js
接收UDP
的问题之后,我正在考虑接收数字(甚至更普遍地说,接收对象(。
我得到的结果是二进制格式的丑陋字符。我应该如何修复它们?
结果:
127.0.0.1:1414 - (�@
127.0.0.1:1414 - ףp=
(�@
127.0.0.1:1414 - �G�z(�@
127.0.0.1:1414 - ��Q�(�@
127.0.0.1:1414 - ���((�@
127.0.0.1:1414 - 33333(�@
127.0.0.1:1414 -
ףp=(�@
127.0.0.1:1414 - �z�G(�@
127.0.0.1:1414 - ���Q(�@
127.0.0.1:1414 - ���((�@
127.0.0.1:1414 - gffff(�@
127.0.0.1:1414 - >
ףp(�@
127.0.0.1:1414 - �G�z(�@
127.0.0.1:1414 - �Q��(�@
127.0.0.1:1414 - ��(�(�@
127.0.0.1:1414 - �����(�@
127.0.0.1:1414 - q=
ף(�@
127.0.0.1:1414 - H�z�(�@
127.0.0.1:1414 - ��Q�(�@
127.0.0.1:1414 - �(��(�@
127.0.0.1:1414 - �����(�@
127.0.0.1:1414 - �p=
�(�@
127.0.0.1:1414 - {�G�(�@
127.0.0.1:1414 - R���(�@
127.0.0.1:1414 - )���(�@
127.0.0.1:1414 - )�@
127.0.0.1:1414 - ףp=
)�@
127.0.0.1:1414 - �G�z)�@
127.0.0.1:1414 - ��Q�)�@
127.0.0.1:1414 - ���()�@
127.0.0.1:1414 - 33333)�@
127.0.0.1:1414 -
应用.js
var PORT = 1414;
var HOST = '127.0.0.1';
var dgram = require('dgram');
var server = dgram.createSocket({ type: 'udp4', reuseAddr: true });
server.on('listening', function () {
var address = server.address();
console.log('UDP Server listening on ' + address.address + ":" + address.port);
});
server.on('message', function (message, remote) {
console.log(remote.address + ':' + remote.port +' - ' + message);
});
server.bind(PORT, HOST);
主.cpp
// g++ main.cpp -o main -std=c++11 -lboost_system -pthread
#include <iostream>
#include <stdio.h>
#include <string>
#include <boost/asio.hpp>
using boost::asio::ip::udp;
int main(int argc, char* argv[])
{
const int port=1414;
const std::string ip="127.0.0.1";
boost::asio::io_service io_service;
udp::resolver resolver(io_service);
udp::endpoint client_endpoint = *resolver.resolve({udp::v4(), ip, std::to_string(port)});
udp::socket socket(io_service, udp::v4());
socket.set_option(boost::asio::socket_base::reuse_address(true));
socket.bind(udp::endpoint(udp::v4(), port));
double data;
for(long i=0;true;i++)
{
data=i*0.01;
socket.send_to(boost::asio::buffer((char *)&data, sizeof(data)), client_endpoint);
usleep(10);
}
return 0;
}
您收到的是包含二进制数据的Buffer
。通过将message
与字符串连接起来,您可以隐式调用message.toString()
默认情况下,它将二进制数据转换为 UTF8,这就是您所看到的。
相反,您需要做的是直接从message
中读取。您可以使用message.read*()
方法从Buffer
读取数字。
但是,您当前的代码仍然会遇到一个问题:发送data
字节的顺序取决于主机的CPU(类型(。最好以网络字节顺序(大端序(通过网络发送数据,以确保兼容性和一致性。
但是,假设您在典型的英特尔或AMD CPU上运行,您应该能够在节点端使用message.readDoubleLE()
.js来读取值。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 从udp接收帧对于人脸识别来说太慢
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- NodeJ 以丑陋的二进制格式接收 UDP 数字