我正在尝试从某些设备中读取某些数据,这些设备连接到我用NodeJS编写的套接字服务器。数据作为二进制流接收,我按照设备规范正确读取每个块。规范与此类似:
byte | size | type | description
-------------------------------------------
0 | 2 | unsigned int | whatever...
2 | 4 | unsigned int | irrelevant...
6 | var | character str | etc...
当我收到这样的数据时,我正在使用特定的Buffer方法读取每个块,例如:
// example code
const tid = data.readUInt16BE(0);
const dataLength = data.readUInt32BE(2);
const rest = data.toString('utf8', 6);
我遇到的问题是读取这个可变长度的数据。我正在使用data.toString('utf8', 6)
(未定义end
因为我只需要其余的数据)但我的rest
变量包含一些奇怪的字符,我怀疑这些字符是回车但在控制台中显示不同每次。例如:
// in each response here, everything before $ character is garbage
// 'clean' response should look like:
// OK
// $DATA=1234567890
// $DATA=0987654321
// etc...
// example code, 1st try
const rest = data.toString('utf8', 6);
console.log(rest);
// results in:
// OK
// ��$DATA=1234567890
// ��$DATA=0987654321
// etc...
// example code, 2nd try
const rest = data.toString('utf8', 6);
console.log(rest);
// results in:
// OK
// i�$DATA=1234567890
// i�$DATA=0987654321
// etc...
// example code, 3rd try
const rest = data.toString('utf8', 6);
console.log(rest);
// results in:
// OK
// UB$DATA=1234567890
// UB$DATA=0987654321
// etc...
// example code, 4th try
const rest = data.toString('utf8', 6);
console.log(rest);
// results in:
// OK
// � $DATA=1234567890
// � $DATA=0987654321
// etc...
// well, you get the point...
事情是每行的开头总是有2个字符,我无法弄清楚它们是什么以及它们为什么会出现。
正如我所说,我认为这是因为回车而发生的,所以我试图用不同的方式替换它:
const rest = data.toString('utf8', 6).replace('\r', '');
// or (makes no sense, but let's try anyways)
const rest = data.toString('utf8', 6).replace(/[\r]/g, '');
// or (hoped that this one will really work)
const rest = data.toString('utf8', 6).replace(/[\n\r]/g, '\n');
// etc...
但是,当然,我的尝试没有任何效果,垃圾字符总会出现。
我的问题是:如何找出这些字符以及我可以尝试删除它们的内容?