Javascript for循环改变内容
NodeJS Javascript for loop changing contents
我有以下代码,用于迭代Buffer查找数据包结束标记。在这个Buffer对象中可能有几个数据包,所以我使用数据包标记来查找数据,处理它,然后通过切片缓冲区移动到下一个。然而,我缺少数据包,因为我在for循环上的条件是缓冲区。长度和缓冲区长度在变化(越来越短),但I值总是在增加!我该怎么解决这个问题?
bufferFragment是捕获部分数据包并将它们附加到下一个数据包的开头。
for (var i = 0; i < buffer.length; i++)
{
if (buffer[i] == 16 && buffer[i + 1] == 3)
{
dataPacket = buffer.slice(0,i+4);
parseData(dataPacket);
buffer = buffer.slice(i+4);
}
else
{
bufferFragment = buffer;
}
}
似乎在某些情况下,当循环较长时,它变得贪婪,捕获了比它应该捕获的更多的数据。
这是一个完整的测试脚本(http://runnable.com/U75ce4esNHFj7028)
var testBufferText = "100207b097a5085da120f30000461003e39410020736e7bb085d4952890000011003a9401002070c8a1f094ca120f394743e10038907100207a41c22095d4008de0000011003437e1002058e535109a0000a1a9b580000000000a963bf10035c45100207d49681095d4952890000011003827b10020b012447505654472c2c542c2c4d2c302e3130392c4e2c302e3230312c4b2c412a32380d0a10032a621002073e36c3095da120f300004610036e461002072297e7095d49528900000110038c5f1002017866350a8d40622d588135b07db35d000000100305ce1002070c673c0a5da120f30000461003fc331002071c21950a0d5aa29a00fc711003165e10";
var testBuffer = new Buffer(testBufferText,'hex');
var bufferFragment;
extractPackets(testBuffer);
function extractPackets(data)
{
var buffer = new Buffer(data);
var origBuffer = buffer;
var findCount = 0;
var startFlag = false;
var shortenedFlag = 0;
var appendedData = false;
if (bufferFragment)
{
buffer = Buffer.concat([bufferFragment, buffer]);
concatBuffer = new Buffer(buffer.length);
buffer.copy(concatBuffer);
appendedData = bufferFragment;
bufferFragment = undefined;
}
for (var i = 0; i < buffer.length; i++) {
if (buffer[i] == 16 && buffer[i + 1] == 16)
{
shortenedFlag += 1;
buffer = Buffer.concat([buffer.slice(0, i), buffer.slice(i + 1)]);
}
}
for (var i = 0; i < buffer.length; i++) {
//Look for a DLE Packet
if (buffer[i] == 16)
{
if (buffer[i + 1] != 16 && buffer[i + 1] != 3)
{
startFlag = true;
break;
}
}
else
{
buffer = buffer.slice(i + 1);
}
}
var sameAsTempBuffer = new Buffer(buffer.length);
buffer.copy(sameAsTempBuffer);
// if we detected a start, look for end of packet 10 03
if(startFlag == true)
{
for (var i = 0; i < buffer.length; i++)
{
if (buffer[i] == 16 && buffer[i + 1] == 3)
{
var dataPacket = buffer.slice(0,i+4);
buffer = buffer.slice(i+4);
i -= 4;
console.log("Data Packet to Process",dataPacket);
}
}
}
if (buffer.length)
{
bufferFragment = buffer;
}
return;
}
输出为
Data Packet to Process <Buffer 10 02 07 b0 97 a5 08 5d a1 20 f3 00 00 46 10 03 e3 94>
Data Packet to Process <Buffer 10 02 07 36 e7 bb 08 5d 49 52 89 00 00 01 10 03 a9 40>
Data Packet to Process <Buffer 10 02 07 0c 8a 1f 09 4c a1 20 f3 94 74 3e 10 03 89 07>
Data Packet to Process <Buffer 10 02 07 a4 1c 22 09 5d 40 08 de 00 00 01 10 03 43 7e>
Data Packet to Process <Buffer 10 02 05 8e 53 51 09 a0 00 0a 1a 9b 58 00 00 00 00 00 a9 63 bf 10 03 5c 45>
Data Packet to Process <Buffer 10 02 07 d4 96 81 09 5d 49 52 89 00 00 01 10 03 82 7b 10 02 0b 01 24 47 50 56 54 47 2c 2c 54 2c 2c 4d 2c 30 2e 31 30 39 2c 4e 2c 30 2e 32 30 31 2c 4b 2c ...>
Data Packet to Process <Buffer 10 02 07 3e 36 c3 09 5d a1 20 f3 00 00 46 10 03 6e 46 10 02 07 22 97 e7 09 5d 49 52 89 00 00 01 10 03 8c 5f 10 02 01 78 66 35 0a 8d 40 62 2d 58 81 35 b0 ...>
前5个是ok的,然后循环变得贪婪并试图捕获更多的数据包!
居然找到答案了!关键是将i添加到偏移量中!
var testBufferText = "100207b097a5085da120f30000461003e39410020736e7bb085d4952890000011003a9401002070c8a1f094ca120f394743e10038907100207a41c22095d4008de0000011003437e1002058e535109a0000a1a9b580000000000a963bf10035c45100207d49681095d4952890000011003827b10020b012447505654472c2c542c2c4d2c302e3130392c4e2c302e3230312c4b2c412a32380d0a10032a621002073e36c3095da120f300004610036e461002072297e7095d49528900000110038c5f1002017866350a8d40622d588135b07db35d000000100305ce1002070c673c0a5da120f30000461003fc331002071c21950a0d5aa29a00fc711003165e10";
var testBuffer = new Buffer(testBufferText,'hex');
var bufferFragment;
extractPackets(testBuffer);
function extractPackets(data)
{
var buffer = new Buffer(data);
var origBuffer = buffer;
var findCount = 0;
var startFlag = false;
var shortenedFlag = 0;
var appendedData = false;
if (bufferFragment)
{
buffer = Buffer.concat([bufferFragment, buffer]);
concatBuffer = new Buffer(buffer.length);
buffer.copy(concatBuffer);
appendedData = bufferFragment;
bufferFragment = undefined;
}
for (var i = 0; i < buffer.length; i++) {
if (buffer[i] == 16 && buffer[i + 1] == 16)
{
shortenedFlag += 1;
buffer = Buffer.concat([buffer.slice(0, i), buffer.slice(i + 1)]);
}
}
for (var i = 0; i < buffer.length; i++) {
//Look for a DLE Packet
if (buffer[i] == 16)
{
if (buffer[i + 1] != 16 && buffer[i + 1] != 3)
{
startFlag = true;
break;
}
}
else
{
buffer = buffer.slice(i + 1);
}
}
var sameAsTempBuffer = new Buffer(buffer.length);
buffer.copy(sameAsTempBuffer);
// if we detected a start, look for end of packet 10 03
if(startFlag == true)
{
for (var i = 0; i < buffer.length; i++)
{
if (buffer[i] == 16 && buffer[i + 1] == 3)
{
var dataPacket = buffer.slice(0,i+4);
buffer = buffer.slice(i+4);
i -= i + 4;
console.log("Data Packet to Process",dataPacket);
}
}
}
if (buffer.length)
{
bufferFragment = buffer;
}
return;
}
相关文章:
- 循环内的值不会改变
- jQuery在循环中改变这个的含义
- 为什么这个循环会改变每一轮中的所有值
- Javascript的右手值在循环中改变自身
- 如何制作改变起点的网站循环进度条
- 在不改变循环速度的情况下更改更新速度
- 循环的Javascript;t似乎正在改变'i'
- 当我执行循环时,AngularJs/Ajax索引正在改变
- 当我简单地改变两个表达式的顺序时,为什么这个for循环不能工作?
- For循环-改变src每个循环
- 在循环中使用setInterval来改变interval
- Javascript while或for循环,改变字符串直到满足条件
- 改变& lt; a>标签border-top's color菜单使用jQuery FOR循环
- 改变循环中元素的背景,然后改变悬停的颜色
- 为什么我的javascript不在这个while循环中改变bg的颜色?
- 改变img src属性值在循环- jquery
- 谷歌地图脚本-改变静态信息与变量从数据库循环
- 对于循环和动画,不能使用变量,因为由于闭包而改变
- Javascript for循环改变内容
- 动态改变循环的方向