43 # buffer 的应用

news2024/11/15 22:50:22

buffer

Buffer 代表的都是二进制数据,代表是内存,它不能扩容(java 数组不能扩容,想扩容可以使用动态数组,或者生成一个新的内存拷贝过去)

服务端可以操作二进制,Buffer 可以和字符串进行相互转换

buffer 的三种声明方式

开发中数字都是以字节为单位

1. 通过长度来声明

Buffer.alloc() 方法创建一个指定大小的新缓冲区对象。

// 创建一个 5 字节的缓冲区对象
const buffer = Buffer.alloc(5);
console.log(buffer);

在这里插入图片描述

2. 根据汉字来转化成 buffer

const buffer = Buffer.from("凯小默");
console.log(buffer);

在这里插入图片描述

3. 通过数组来指定存放的内容(不常用)

const buffer = Buffer.from([0xe5, 0x87, 0xaf, 0xe5, 0xb0, 0x8f, 0xe9, 0xbb, 0x98]);
console.log(buffer);
console.log(buffer.toString());

在这里插入图片描述

buffer 的方法

buffer 不具备扩展 push、shift 这些方法

length

可以获取 buffer 字节的长度

const buffer = Buffer.from("凯小默"); // 一个汉字 3 字节
console.log(buffer);
console.log(buffer.length); // 9 

在这里插入图片描述

slice

slice 方法是浅拷贝,buffer 存放的都是内存地址,所有 slice 不会返回一个新的 buffer

const buffer = Buffer.alloc(5);
let buf = buffer.slice(0, 1);
console.log(buf);
buf[0] = 100;
console.log(buffer);

这里 100 的 16 进制就是 64。

在这里插入图片描述

isBuffer

这个是 Buffer 的静态方法,用于判断是否是 buffer 类型

const buffer = Buffer.from("凯小默");
console.log(Buffer.isBuffer(buffer));

在这里插入图片描述

copy(用的少)

缓冲区是一种临时存储器,用于在将数据从一个位置移动到另一位置时存储数据。它就像一个整数数组。

Buffer.copy() 方法只是将所有值从输入缓冲区复制到另一个缓冲区。

copy 参数 (target, targetStart, sourceStart, sourceEnd)

  • target:它是一个缓冲区,需要在其中复制所有值。
  • targetStart:它指的是目标缓冲区的元素将开始写入的起始索引。其默认值为 0。
  • sourceStart:它是输入缓冲区的索引,将从该索引开始复制值。其默认值为 0。
  • sourceEnd:输入缓冲区的索引,直到完成值的复制为止。其默认值为 buffer.length

在这里插入图片描述

const buf1 = Buffer.from("凯小默");
const buf2 = Buffer.from("博客");
// 声明 15 个刚好能放下
const bigBuf = Buffer.alloc(15);
console.log("1---->", bigBuf, bigBuf.toString());
buf1.copy(bigBuf, 0, 0, 9);
console.log("2---->", bigBuf, bigBuf.toString());
buf2.copy(bigBuf, 9, 0, 6);
console.log("3---->", bigBuf, bigBuf.toString());

在这里插入图片描述

copy 方法的大致实现

Buffer.prototype.copy = function (target, targetStart, sourceStart, sourceEnd) {
    console.log("进入--kaimo--copy");
    // 将需要 copy 的 source 从 sourceStart 到 sourceEnd 循环遍历
    for (let i = sourceStart; i < sourceEnd; i++) {
        // 从 targetStart 开始,赋值给 target 的每一项
        target[targetStart++] = this[i];
    }
};
const buf1 = Buffer.from("凯小默");
const buf2 = Buffer.from("博客");
// 声明 15 个刚好能放下
const bigBuf = Buffer.alloc(15);
console.log("1---->", bigBuf, bigBuf.toString());
buf1.copy(bigBuf, 0, 0, 9);
console.log("2---->", bigBuf, bigBuf.toString());
buf2.copy(bigBuf, 9, 0, 6);
console.log("3---->", bigBuf, bigBuf.toString());

在这里插入图片描述

concat

concat 的原理就是 copy。

concat 有两个参数 concat(list, length).

在这里插入图片描述

const buf1 = Buffer.from("凯小默");
const buf2 = Buffer.from("博客");
const bigBuf = Buffer.concat([buf1, buf2], 15);
console.log(bigBuf, bigBuf.toString());

在这里插入图片描述

concat 大致实现原理

const buf1 = Buffer.from("凯小默");
const buf2 = Buffer.from("博客");
Buffer.concat = function (list, length = list.reduce((x, y) => x + y.length, 0)) {
    console.log(list, length);
    let buffer = Buffer.alloc(length);
    let offset = 0; // 偏移量
    list.forEach((buf) => {
        buf.copy(buffer, offset);
        offset += buf.length;
    });
    return buffer.slice(0, offset);
};
const bigBuf = Buffer.concat([buf1, buf2, buf1, buf2]);
console.log(bigBuf, bigBuf.toString());

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/692861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习adaboost(二,第一次迭代,c#实现)

我觉得这两个公式推导的特别好。我们来搞第一次迭代&#xff1a; 我们取x<2.5,标签1&#xff0c;else&#xff0c;标签-1这个分类器&#xff0c;发现分错的是5&#xff0c;7&#xff0c;8三组数据 &#xff0c;正确的都由0.1变为0.0714了&#xff0c;降低了&#xff0c;错误…

课程20:API项目重构

🚀前言 本文是《.Net Core从零学习搭建权限管理系统》教程专栏的课程(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。 专栏适用于人群:We…

Debezium系列之:记录一次Debezium集群服务器端口打满的原因和对应的解决方法

Debezium系列之:记录一次Debezium集群服务器端口打满的原因和对应的解决方法 一、背景二、查看被占端口使用情况三、查看日志四、定位原因五、快速解决六、再次查看服务器端口使用情况七、总结一、背景 运维Debezium集群,停止Debezium集群后,再次启动Debezium集群提示端口被…

一个注解让你的项目减少30%SQL代码量

今天给大家介绍一个很好用的开源项目&#xff1a;easy_trans&#xff0c;它能让你的项目减少30%的SQL代码量&#xff0c;接下来让我们进一步了解它。 什么是Easy_Trans Easy Trans是一款用于做数据翻译的代码辅助插件&#xff0c;利用MyBatis Plus/JPA/BeetlSQL 等ORM框架的能…

算法----使二进制字符串字符交替的最少反转次数

题目 给你一个二进制字符串 s 。你可以按任意顺序执行以下两种操作任意次&#xff1a; 类型 1 &#xff1a;删除 字符串 s 的第一个字符并将它 添加 到字符串结尾。 类型 2 &#xff1a;选择 字符串 s 中任意一个字符并将该字符 反转 &#xff0c;也就是如果值为 ‘0’ &…

django框架-2

创建项目 创建项目文件夹创建项目 django-admin startproject BaseDjangoProject 创建应用 python manage.py startapp goods settings.py 在最后面添加上应用goods INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contr…

Java字符串中字符的Unicode码点、编码

以前对于Java字符串中字符的Unicode码点、UTF编码没有仔细研究。今天研究了下。 Unicode是一个字符集&#xff0c;其实是一个映射&#xff0c;给每个字符映射了一个数值&#xff0c;称为码点&#xff08;Code Point&#xff09;。 而UTF-8、UTF-16、UTF-32则是对Unicode码点的转…

shiro反序列化漏洞

Shiro简述 Shiro 是 Java 的一个安全框架&#xff0c;执行身份验证、授权、密码、会话管理shiro默认使用了CookieRememberMeManager&#xff0c;其处理cookie的流程是&#xff1a;得到rememberMe的cookie值–>Base64解码–>AES解密–>反序列化 然而AES的密钥是硬编码…

今日分享:ai绘画工具

凯蒂是一位充满梦想和热情的年轻女孩。她从小就对艺术充满了浓厚的兴趣&#xff0c;尤其痴迷于绘画。然而&#xff0c;她一直感到自己的绘画技巧有限&#xff0c;无法将内心的想象力完美地呈现在画布上。她渴望找到一种方法来提升自己的创作能力&#xff0c;实现内心的艺术梦想…

ModaHub魔搭社区:详解向量数据库Milvus的Mishards:集群分片中间件(一)

目录 Mishards&#xff1a;集群分片中间件 Mishards 是什么 Mishards 简单工作原理 Mishards 目标场景 基于 Mishards 的集群方案 总体架构 主要构件 Mishards 配置 全局配置 Mishards&#xff1a;集群分片中间件 Mishards 是什么 Mishards 是一个用 Python 开发的 …

2020年全国硕士研究生入学统一考试管理类专业学位联考数学试题——纯题目版

2020 级考研管理类联考数学真题 一、问题求解&#xff08;本大题共 15 小题&#xff0c;每小题 3 分&#xff0c;共 45 分&#xff09;下列每题给出 5 个选项中&#xff0c;只有一个是符合要求的&#xff0c;请在答题卡上将所选择的字母涂黑。 1、某产品去年涨价 10%&#xf…

野蛮扩张结束,研发效能提升这场“仗”如何布局?

引言 从第一块石头被打磨成石器&#xff0c;到青铜铸造术被发明&#xff1b;从蒸汽机的改良与广泛应用&#xff0c;到交流电和发电机的问世&#xff0c;纵观人类发展史&#xff0c;人类文明的发展始终依托于生产力与生产效率的不断提升。 身处软件“吞噬”世界的数字化时代&am…

【软考网络管理员】2023年软考网管初级常见知识考点(28)-系统开发和项目管理

涉及知识点 软件生命周期&#xff0c;软件生命周期概念&#xff0c;软件开发模型&#xff0c;瀑布模型&#xff0c;演化、增量模型&#xff0c;喷泉模型&#xff0c;程序控制结构&#xff0c;控制结构种类&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络…

jmeter之对常数吞吐量定时器的理解与使用

详细看这个文章&#xff1a;jmeter之对吞吐量定时器的理解与使用_常数吞吐量定时器_xiaokanfuchen86的博客-CSDN博客 下面是我自己的进行的一点补充&#xff1a;如下图&#xff0c;两个请求中&#xff0c;一个下买单一个下卖单&#xff0c;在【下买单-buy】请求下的常数吞吐量…

略读 # SourcererCC: Scaling Code Clone Detection to Big Code

《SourcererCC: Scaling Code Clone Detection to Big Code》代码克隆检测基线方法之一&#xff1b; ABSTRACT 面向的问题&#xff1a;代码克隆检测在海量源码的场景下的扩展性问题&#xff1b; 提出的解决方案&#xff1a;SourcererCC&#xff0c;a token-based clone detec…

Java面试题【1】

Java面试题 文章目录 Java面试题Java基础以及api程序题1.下面sum的值是&#xff08; D &#xff09;2.下面程序的运行结果&#xff08; A &#xff09;3.若x是float类型变量&#xff0c;x10/4; 则x的值是&#xff08; B &#xff09;4.以下程序的输出结果是&#xff08;x 99 , …

Redis 缓存数据库双写不一致怎么处理?

一、概述&#xff1a; Redis 缓存数据库可能会出现双写不一致的情况&#xff0c;这是因为在进行缓存更新时&#xff0c;同时有多个线程或进程对同一个缓存键进行读写操作&#xff0c;导致了数据的不一致性。 具体来说&#xff0c;假设有两个线程 A 和 B 都要对同一个缓存键进…

【C语言】常用的字符串函数使用 模拟实现

前言字符串的组成 strlen模拟实现stlen strcpy模拟实现strcpy strcmp模拟实现strcmp strcat模拟实现strcat 前言 在使用下面介绍的库函数时声明以下头文件 #include <string.h>字符串的组成 如下字符数组 str 看似只包含abcde五个字符&#xff0c;实际上由6个字符组成…

随着人工智能时代的到来,算力需求的成倍增长成为新的趋势

方向一&#xff1a;AI与算力相辅相成 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科技革命和产业变革的重要驱动力量。…

python 时间操作

写代码的时候&#xff0c;我建议还是要使用准确的时间刊一下这个结果&#xff0c;然后再减去开始的计数操作 我之前的操作是 time package from time import sleep from time import time import sys t0 time() sleep(3) t1 time()print(" cost {} s".format(…