node里面的buffer理解

node提供了专门读写文件的模块,文件内容都是2进制存放在内存中的

node读取文件的结果都是16进制,那么你要学会进制转换,二进制0b开头 ,八进制0开头,十六进制0x

基础知识:

1字节=8bit

一个汉字=3字节,在不同的编码下字节个数还有不同的

一个英文=1字节

buffer里面用16机制表示

Buffer.alloc(3) // 3是代表字节

创建一个有3个字节的内存空间

<Buffer 00 00 00>

默认是0x00 0x00 0x00 0x00

let buf1 = Buffer.alloc(12)
let buf2 = Buffer.from(‘hello‘)
let buf3 = Buffer.from(‘world‘)
buf2.copy(buf1, 0, 0, 5)
buf3.copy(buf1, 5, 0, 5)
console.log(buf1.toString())
// helloworld

简单的实现一下copy的方法

Buffer.prototype.copy = function (target, targetStart, sourceStart, sourceEnd) {
  for(let i = 0; i < sourceEnd-sourceStart; i++) {
    target[targetStart + i] = this[sourceStart + i]
  }
}

上面是通过copy方法把两个内存拷贝到一起,还有concat方法也可以

let cat = Buffer.concat([buf2, buf3])

两个buffer拼接到一起,返回的一个新的buffer,第二次参数是指定长度

基本原理是这样的

Buffer.concat = function (lists, len = lists.reduce((prev, next) => prev + next.length, 0)) {
  let buf = Buffer.alloc(len);
  let offset = 0;
  for(let i = 0; i < lists.length; i++) {
    lists[i].copy(buf, offset, 0, lists[i].length)
    offset += lists[i].length
  }
  return buf.slice(0, offset) // 返回有效的内容
}

buffet中的indexOf可以知道当前存在的位置

let index = Buffer.from(‘a*b‘).indexOf(‘*‘)
console.log(index)

当时很遗憾buffer没有split来拆分成两段buffer,辣么就自己写

Buffer.prototype.split = function (step) {
  let arr = [];
  let pos = 0;
  // 找不到返回-1
  let len = Buffer.from(step).length; // 按照buffer的长度来计算的呀
  let offset = 0; // 偏移量
  while (-1 !== (offset = this.indexOf(step, pos))) {
    arr.push(this.slice(pos, offset));
    pos = offset + len;
  }
  arr.push(this.slice(pos));
  return arr;
}

原文地址:https://www.cnblogs.com/wuxianqiang/p/10328296.html

时间: 2024-10-12 15:04:42

node里面的buffer理解的相关文章

友盟推送里面的Alias怎么用?可以理解成账号吗?

友盟推送里面的Alias怎么用?可以理解成账号吗? 我们的App有自己的账号体系的,想在每次用户登陆的时候,给用户发一个欢迎消息. 看了一下友盟推送,里面有一个概念叫做Alias(别名),但是官方文档写着Alias是和设备绑定的,感觉Alias算不上是严格意义的账号.不知道其它集成过友盟推送的兄弟们是否有类似的需求,是否可以通过友盟推送提供的Alias功能来满足我们的需求? 作者:沙漠链接:http://www.zhihu.com/question/31882775/answer/5425406

深入理解js里面的this

闲聊两句(可以忽略): 毕业有半年了,时间还过得真快,不过还好,感觉自己相对于刚毕业那会确实成长了很多:好久没有打游戏了(自己决心要戒掉的),消磨时光的时候就看看电影或者追追电视剧,再无聊就洗洗衣服.扫扫地,实在不行就拿起手边的书看.照我以前的习惯,我除了上课时间可能看书,其他的时间是完全看不进的,所以觉得这也是自己进步的地方. 最近自己想开始学习前端工程师现在最流行的东西,nodejs,听说可以写服务端.听说是事件驱动.听说...听说了很多很多关于它的好,所以我也决心要好好学这个.推荐我收集的

[python]如何理解uiautomator里面的 child, child_by_text, sibling,及使用场景

如何理解uiautomator里面的 child, child_by_text, sibling,我们借助android原生的uiautomatorviewer抓取的控件来进行理解 以如下图进行详细讲解(左边与右边的通过不同颜色进行圈起来,表示了这些控件的归属关系),例如红圈部分为一个父类,投影绿圈和黄圈均为它的子类(称为child),而绿圈和黄圈属于同级别关系,则可以理解为兄弟关系(称为sibling) 比如要点击"Navigation bar hide"的开关进行打开或者关闭,则代

drupal里面的ajax最粗浅的理解-流程

1,  form里面的ajax所在地表单元素有一个事件,激发system/ajax,相应的有ajax_form_callback(), 重新取到表单,并处理之, 并rebuild之,然后用#ajax的callback来处理$form, $form_state, 最后返回新的表单render array, 然后被渲染; 2,  a href里面的use-ajax,激活相应的path menu item, 然后局部刷新一些数据,然后返回render array, 然后被渲染 3,  #states,

自定义Button,复写里面的onKeyDown,不起作用

李刚的Android疯狂讲义真是"疯狂",浪费了3天时间,到底是他的代码有问题,还是怎么的不得而知. 问题描述:他的书里面第3.3基于回调事件处理Propagation的例程.是为了掩饰基于回调事件传播的例程序,源代码如下: MyButton.java public class MyButton extends Button { public MyButton(Context context , AttributeSet set) { super(context , set); } @

koa2 中间件里面的next到底是什么

koa2短小精悍,女人不爱男人爱. 之前一只有用koa写一点小程序,自认为还吼吼哈,知道有一天某人问我,你说一下 koa或者express中间件的实现原理.然后我就支支吾吾,好久吃饭都不香. 那么了解next的最好办法是什么, 百度,谷歌,知乎?  没错,肯定有用,我觉得最有用的是看源码和debug去理解. 先看下面的一段代码 ,会输出什么,只会输出  X-Response-Time const Koa = require('koa'); const app = new Koa(); // x-

File 里面的flush()和close()

前天项目组遇到文件上传,对内存加大的问题.特意看了看相关知识,也对这个有一定的了解 try { FileInputStream fis=new FileInputStream(new File("/home/saas/maven/maven.zip")); BufferedInputStream bis=new BufferedInputStream(fis); FileOutputStream fos=new FileOutputStream(new File("/home

koa2 use里面的next到底是什么

koa2短小精悍,女人不爱男人爱. 之前一只有用koa写一点小程序,自认为还吼吼哈,知道有一天某人问我,你说一下 koa或者express中间件的实现原理.然后我就支支吾吾,好久吃饭都不香. 那么了解next的最好办法是什么, 百度,谷歌,知乎?  没错,肯定有用,我觉得最有用的是看源码和debug去理解. 先看下面的一段代码 ,会输出什么,只会输出  X-Response-Time const Koa = require('koa'); const app = new Koa(); // x-

遍历交换机里面的mac地址,与公司登记mac合法的mac地址进行对比

脚本目的:查找mac黑名单 日    期:2015年08月20日 联系邮箱:[email protected] Q Q  群:1851 15701 51CTO博客首页:http://990487026.blog.51cto.com 开源社区,有你更精彩! 简介: 遍历交换机里面的mac地址,与公司登记mac合法的mac地址进行对比,匹配到了是合法的,未匹配到就是黑名单. 需求分析:查找mac黑名单 公司登记的PC,MAC,Server设备的mac地址,有一个表单 rmac文件 公司登记的是这样的