node种buffer对象数组 深拷贝浅拷贝问题
node的一个上位机和下位机通信的转发程序,用的是udp转发.
其中在发送的时候会进行一次rc4加密数据
出现问题就在这个加密数据这一块,因为这个是升级包广播发送.提前生成了升级用的广播报文,是一个buffer数组,前四个元素是升级请求体,后面依次是升级包体.
上位机控制程序发送次数,一般设置三次.
发送升级包数据是采用递归调用发送,升级包发送方法
function sendUpgradePackage(gatewayId, buffer, port, address, sendnum = 1, index = 0, send = 0) {
if (!common.upgradeflag[gatewayId].ret) {
return;
}
if (index >= buffer.length) {
send++;
if (send >= sendnum) {
common.upgradeflag[gatewayId].ret = false;
return;
} else {
index = 0;
}
}
console.log(index, send, '===>>>buff', buffer[index].toString('hex'));
sendCipherMessage(buffer[index], 0, buffer.length, port, address, err => {
if (err) {
log.appendLog('send_error:' + err);
}
});
index++;
setTimeout(function() {
sendUpgradePackage(gatewayId, buffer, port, address, sendnum, index, send);
}, 100);
}
后续是一个rc4加密数据包的方法 代码省略部分
parseBody.buffer = databuffer.slice(cipherlen, cipherlen + parseBody.length);
// console.log('密钥', parseBody.deviceId, '=====>>>>>', createwaytewaykey.GATEWAYKEYDIR[parseBody.deviceId].key);
let decipher = crypto.createCipheriv('rc4', createwaytewaykey.GATEWAYKEYDIR[parseBody.deviceId].key, '');
parseBody.buffer = decipher.update(parseBody.buffer);
parseBody.buffer.copy(databuffer, cipherlen);
其中databuffer 就是传过来的buffer[index]
因为直接对这个参数进行了修改导致第一遍发送的时候数据是正常的,第二遍发送的时候数据就开始错误.因为第一遍发送的时候将原buffer数组内数组内容改变了,导致对加密过的数据进行再次加密,下位机就无法解析数据.
这个问题排查后又发现了另一个问题,就是不加密的问题~~~因为在调试过程中一直重启服务,导致服务内存没保存网关的key,导致没有加密,后续网关心跳上来以后才开始对后续的加密.
整个服务已经过于混乱,需要兼容很多旧设备,其中的字节流解析差异太大,各种判断进行解析.
整个上位机也出现了这个问题,因为设备等问题,导致整个表结构不适合现在的设备存储.但是一直没有时间重构,也不敢大的重构,面向的api过多过杂.牵一发动全身.
这段时间都是做node后端,建了一个群 做后端node的可以一起交流一下 932491438
node种buffer对象数组 深拷贝浅拷贝问题的更多相关文章
- python: 序列化/反序列化及对象的深拷贝/浅拷贝
一.序列化/反序列化 python中内置了很多序列化/反序列化的方式,最常用的有json.pickle.marshal这三种,示例用法如下: import json import pickle imp ...
- nodeJS之二进制buffer对象
前面的话 在ES6引入TypedArray之前,JavaScript语言没有读取或操作二进制数据流的机制.Buffer类被引入作为Nodejs的API的一部分,使其可以在TCP流和文件系统操作等场景中 ...
- Node.js Buffer(缓冲区)
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...
- 8、Node.js Buffer(缓冲区)
内容:Buffer与字符编码,Buffer创建.写入.读取.转换成JSON对象.合并.比较.拷贝.裁剪.长度 Buffer 与字符编码Buffer 实例一般用于表示编码字符的序列,比如 UTF-8 . ...
- ES6 set和map数据结构对对象数组去重简单实现
自从有了es6的set数据结构,数组的去重可以简单用一行代码实现,比如下面的方式 let arr = [1, 2, 2, 3, 4] function unique (arr) { return [. ...
- fastjson: json对象,json对象数组,javabean对象,json字符串之间的相互转化
fastjson: json对象,json对象数组,javabean对象,json字符串之间的相互转化 在开发过程中,经常需要和前端交互数据,数据交互的格式都是JSON,在此过程中免不了json字符串 ...
- JS中实现数组和对象的深拷贝和浅拷贝
数组的拷贝 > 数组的深拷贝,两层 var arr = [[1,2,3],[4,5,6],[7,8,9]]; var arr2 = []; 循环第一层数组 for(var i=0,len=arr ...
- js 中数组或者对象的深拷贝和浅拷贝
浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变! 深拷贝:就是重新复制一块内存,这样就不会互相影响. 有些时候我们定义 ...
- JS对象复制(深拷贝、浅拷贝)
如何在 JS 中复制对象 在本文中,我们将从浅拷贝(shallow copy)和深拷贝(deep copy)两个方面,介绍多种 JS 中复制对象的方法. 在开始之前,有一些基础知识值得一提:Javas ...
随机推荐
- HDU 6602 Longest Subarray (线段树)
题意: 1e5的数组,c(1e5)种数字求最长的子串,使得其中每个出现的数字出现的次数为0次或者大于k次 思路: 枚举右端点i,维护当前右端点时,每个左端点的可行元素数量,当且仅当可行元素为c时更新答 ...
- 转AngularJS路由插件
AngularJS学习笔记--002--Angular JS路由插件ui.router源码解析 标签: angular源码angularjs 2016-05-04 13:14 916人阅读 评论(0) ...
- Standby Redo Logs的前世今生与最佳实践
编辑手记:使用过Data Guard的人应该对于Standby Redo Logs都不陌生,在配置了 Standby Redo Logs的standby中,能够进行日志的实时应用,同时Standby ...
- Go语言实现:【剑指offer】机器人的运动范围
该题目来源于牛客网<剑指offer>专题. 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之 ...
- Load_file 常用路径
load_file 常用路径 WINDOWS下: c:/boot.ini //查看系统版本 c:/windows/php.ini //php配置信息 c:/windows/my.ini //MYSQL ...
- Linux安装Redis,在测试阶段即make test出现“You need tcl 8.5 or newer in order to run the Redis test”问题解决方案
Linux安装Redis,在测试阶段即make test出现"You need tcl 8.5 or newer in order to run the Redis test"问题 ...
- vue垂死挣扎--遇到的问题
1, 原生js监听浏览器后退及禁用返回 +. 涉及到的history的知识 2, watch监听路由变化
- Spring Boot 2从入门到放弃(持续更新)
入门 Spring Boot 2项目的搭建和启动(入门篇1) Spring Boot 2项目的搭建和启动(入门篇2) spring boot 2项目自定义父pom Spring Boot 2开发工具s ...
- bitmap+文本生成新的bitmap的实现
注:参数content为生成二维码bitmap的内容,该二维码bitmap在和文本title组合生成一个新的bitmap package info.ecloud.merchant.util; impo ...
- redis 5.0.7 源码阅读——双向链表
redis中双向链表相关的文件为:adlist.h与adlist.c 一.数据结构 redis里定义的双向链表,与普通双向链表大致相同 单个节点: typedef struct listNode { ...