gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

詳解Node.js中Buffer對(duì)象的操作(創(chuàng)建、讀寫)

本篇文章帶大家了解一下Node中的Buffer對(duì)象,介紹一下創(chuàng)建 Buffer 對(duì)象、讀 Buffer 對(duì)象、寫 Buffer 對(duì)象的方法,希望對(duì)大家有所幫助!

詳解Node.js中Buffer對(duì)象的操作(創(chuàng)建、讀寫)

Buffer 是 Node.js 的內(nèi)置類型,它是用來表示內(nèi)存中一塊區(qū)域的,用以保存二進(jìn)制數(shù)據(jù),可以將它看做為一個(gè)二進(jìn)制數(shù)組。

Buffer 可以用來表示圖片、視頻這樣的二進(jìn)制數(shù)據(jù),另外我們從文件中讀取到的也是 Buffer 類型的數(shù)據(jù),從網(wǎng)絡(luò)中接收的數(shù)據(jù)也是 Buffer 類型的數(shù)據(jù),所以學(xué)習(xí) Buffer 還是很有必要的。

Buffer 位于全局作用域中,所以不需要通過 require('buffer') 來引入 Buffer。

創(chuàng)建 Buffer 對(duì)象

alloc

我們可以通過 Buffer.alloc(size, [fill], [encoding]) 來分配一個(gè) size 字節(jié)大小的內(nèi)存,還可以接收兩個(gè)可選參數(shù)

  • fill:使用 fill 來填充 Buffer 中的每一個(gè)字節(jié)
  • encoding:如果 fill 為字符串,那么使用 encoding 來對(duì)字符串進(jìn)行編碼為二進(jìn)制

當(dāng)不指定 fill 參數(shù),默認(rèn)為填充 0。

const buf1 = Buffer.alloc(5); console.log(buf1); // <Buffer 00 00 00 00 00>  const buf2 = Buffer.alloc(10, 1); console.log(buf2); // <Buffer 01 01 01 01 01 01 01 01 01 01>  const buf3 = Buffer.alloc(12, "hello world!", "utf-8"); console.log(buf3); // <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64 21>

我們還可以使用 allocUnsafe(size) 來分配指定大小的內(nèi)存,不過不會(huì)默認(rèn)填充 0,其中的內(nèi)容不確定

const buf = Buffer.allocUnsafe(5); console.log(buf); // <Buffer c0 84 7c 2a 7b>

我們可以通過 fill(fill, encoding) 方法為 Buffer 對(duì)象填充指定值

const buf = Buffer.allocUnsafe(5); buf.fill(0); console.log(buf); // <Buffer 00 00 00 00 00>

from

我們也可以通過 Buffer.from() 方法來創(chuàng)建一個(gè) Buffer 對(duì)象,from 方法可以接收的參數(shù)包括數(shù)組,字符串,Buffer 對(duì)象,對(duì)象等類型。

接收一個(gè)整形數(shù)組,數(shù)組中的整數(shù)應(yīng)該在 0~255 之間,超出此范圍的數(shù)字將會(huì)被截?cái)?/p>

const buf = Buffer.from([1, 2, 3, 4, 5]); console.log(buf); // <Buffer 01 02 03 04 05>

我們還可以像其中傳入一個(gè)字符串,并指定編碼,它會(huì)使用指定編碼將字符串編碼為二進(jìn)制,如果不指定編碼的話,默認(rèn)為編碼為 utf-8

const buf = Buffer.from("hello", "utf-8"); console.log(buf); // <Buffer 68 65 6c 6c 6f>

from 方法還可以接收一個(gè) Buffer 對(duì)象,它會(huì)拷貝傳入的 Buffer 對(duì)象中的數(shù)據(jù)到新的 Buffer 對(duì)象中

const buf1 = Buffer.from("hello", "utf-8"); const buf2 = Buffer.from(buf1);  console.log(buf1 === buf2); // false console.log(buf2.toString()); // hello

from 方法還可以接收一個(gè)對(duì)象,當(dāng)傳入對(duì)象,首先會(huì)將對(duì)象轉(zhuǎn)化為原始值,然后根據(jù)原始值轉(zhuǎn)化為對(duì)應(yīng)的二進(jìn)制數(shù)組

let obj = {   [Symbol.toPrimitive](hint) {     return "a";   }, };  const buf = Buffer.from(obj); console.log(buf.toString()); // a

Buffer 對(duì)象的屬性

length

通過 length 屬性可以知道 Buffer 數(shù)組的長度

const buf = Buffer.from("Hello World!");  console.log(buf.length); // 12

buffer

Buffer 對(duì)象內(nèi)部實(shí)際存儲(chǔ)數(shù)據(jù)的是一個(gè) ArrayBuffer 的對(duì)象,通過 buffer 屬性可以得到這個(gè)對(duì)象

const buf = Buffer.alloc(5);  console.log(buf.buffer); // ArrayBuffer { [Uint8Contents]: <00 00 00 00 00>, byteLength: 5 }

讀 Buffer 對(duì)象

本節(jié)介紹如何訪問 Buffer 對(duì)象中的內(nèi)容。

下標(biāo)

在文章的開頭提過,我們可以將 Buffer 對(duì)象看做是一個(gè)二進(jìn)制數(shù)組,既然是數(shù)組,那么就可以通過下標(biāo)的形式來訪問數(shù)組中的內(nèi)容。

const buf = Buffer.from([1, 2, 3, 4, 5]); console.log(buf[0]); // 1 console.log(buf[5]); // undefined

它們會(huì)以補(bǔ)碼的形式解析字節(jié),返回對(duì)應(yīng)的數(shù)字。

readXxx

我們還可以通過 buf.readInt8() buf.readInt16() buf.readUint8() buf.readUint16() 等方法來訪問 Buffer 對(duì)象中的內(nèi)容。

const buf = Buffer.from([1, 2, 3, 4, 5]); console.log(buf.readInt8(2)); // 3  // 訪問超出范圍的內(nèi)容,會(huì)拋出 RangeError console.log(buf.readInt8(5)); // RangeError [ERR_OUT_OF_RANGE]: The value of "offset" is out of range.

迭代器

Buffer 對(duì)象的迭代器同數(shù)組的迭代器相同,也有三個(gè)迭代器,分別是

  • entries
  • keys
  • values

我們通過遍歷迭代器來訪問 Buffer 對(duì)象中的內(nèi)容。

const buf = Buffer.from([3, 4, 2]);  for (let entry of buf.entries()) {   // 數(shù)組的一個(gè)元素為下標(biāo),第二個(gè)元素為下標(biāo)對(duì)應(yīng)的元素   console.log(entry); // [ 0, 3 ]                       // [ 1, 4 ]                       // [ 2, 2 ] }
for (let key of buf.keys()) {   console.log(key); // 0                     // 1                     // 2 }
for (let value of buf.values()) {   console.log(value); // 3                       // 4                       // 2 }

寫 Buffer 對(duì)象

本小節(jié)講解如何向 Buffer 對(duì)象中寫入內(nèi)容。

下標(biāo)

我們可以直接通過下標(biāo)來改變 Buffer 對(duì)象中的內(nèi)容

const buf = Buffer.from([1, 2, 3]);  // 通過下標(biāo)設(shè)置值 buf[0] = 4;  console.log(buf); // <Buffer 04 02 03>

write

我們可以通過 write(string, [offset], [length], [encoding]) 方法向 Buffer 中寫入字符串:

  • string:表示要寫入的字符串
  • offset:偏移量,即跳過 offset 個(gè)字節(jié)開始寫入,默認(rèn)為 0
  • length:要寫入的最大字節(jié)數(shù),不超過 buf.length - offset,默認(rèn)值為 buf.length - offset
  • encoding:指定編碼,默認(rèn)為 utf-8

該方法返回已寫入的字節(jié)數(shù)。

const buf = Buffer.from([1, 2, 3, 4]);  // 跳過 1 個(gè)字節(jié)開始寫入,1hi4 buf.write("hi", 1);  console.log(buf); // <Buffer 01 68 69 04>

writeXxx

同 readXxx,我們可以通過 writeInt8() 方法向 buf 中寫入數(shù)據(jù),方法接收兩個(gè)參數(shù):

  • value:要寫入的值
  • offset:偏移量,默認(rèn)為 0
const buf = Buffer.alloc(5);  buf.writeInt8(1, 0); buf.writeInt8(3, 1);  console.log(buf); // <Buffer 01 03 00 00 00>

踩坑:沒有 writeInt16(),不過有 writeInt16BE()writeInt16LE(),分別代表以大端序、小端序?qū)懭搿?/p>

其他方法

isBuffer

該方法接收一個(gè)對(duì)象,用來判斷該對(duì)象是不是一個(gè) Buffer 對(duì)象

let obj1 = {}; let obj2 = Buffer.alloc(3);  console.log(Buffer.isBuffer(obj1)); // false console.log(Buffer.isBuffer(obj2)); // true

isEncoding

該方法接收一個(gè)代表編碼的字符串,返回 Buffer 是否支持該種編碼,如果支持則返回 true,否則返回 false

console.log(Buffer.isEncoding("utf-8")); // true console.log(Buffer.isEncoding("utf8"));  // true console.log(Buffer.isEncoding("hex"));   // true console.log(Buffer.isEncoding("latin")); // false console.log(Buffer.isEncoding("gbk"));   // false

slice

slice(start, end) 可以裁切原有的 Buffer 對(duì)象,返回一個(gè)新的 Buffer 對(duì)象,其中 start 和 end 代表裁切的起始位置和結(jié)束位置,左閉右開 [start, end),這兩個(gè)參數(shù)是可選的,start 默認(rèn)為 0,end 默認(rèn)為 buf.length。返回的 Buffer 對(duì)象與原先對(duì)象引用的是同一塊內(nèi)存,即它們的 buffer 屬性是一樣的。

const buffer = Buffer.from("hello world!");  const newBuffer = buffer.slice(6); // 裁切 6 以后的內(nèi)容到新數(shù)組 console.log(newBuffer.toString()); // world!  console.log(buffer.buffer === newBuffer.buffer); // true

subarray

subarray(start, end) 幾乎可以看做等同于 slice 方法了,二者的語義不同,不過行為確實(shí)一致的,subarray 的語義表示返回原數(shù)組的某個(gè)范圍的子數(shù)組,而 slice 的語義表示的裁切。同樣 subarray 返回新的 Buffer 對(duì)象,并且返回的 Buffer 對(duì)象的 buffer 與原 Buffer 對(duì)象的 buffer 屬性是相同的。

const buffer = Buffer.from("hello world!");  const newBuffer = buffer.subarray(6); console.log(newBuffer.toString()); // world!  console.log(buffer.buffer === newBuffer.buffer); // true

copy

copy(target, [targetStart], [sourceStart], [sourceEnd]) 方法是將 source 從 sourceStart 到 sourceEnd 的內(nèi)容復(fù)制到 target 從 targetStart 的位置,見下動(dòng)圖

詳解Node.js中Buffer對(duì)象的操作(創(chuàng)建、讀寫)

除了 target 以外,其他三個(gè)參數(shù)都是可選參數(shù),targetStart 與 sourceStart 的默認(rèn)值為 0,sourceEnd 的默認(rèn)值為 buf.length.

const buf1 = Buffer.from("HelloWorld"); const buf2 = Buffer.alloc(8);  buf1.copy(buf2, 0, 1, 9);  console.log(buf2.toString()); // elloWorl

includes

buf.includes(value, [offset], [encoding]) 方法的作用是判斷 value 是否在 buf 中。

value 可以是一個(gè)字符串,也可以是一個(gè) Buffer 對(duì)象,也可以是一個(gè)整數(shù);offset 用來規(guī)定查找范圍,表示從 offset 處開始查找,默認(rèn)為 0;enconding 表示編碼,默認(rèn)為 utf-8

const buf = Buffer.from("HelloWorld");  // 默認(rèn)從 0 開始搜索 console.log(buf.includes("H")); // true // 從 1 開始搜索,后面不包含 H console.log(buf.includes("H", 1)); // false  console.log(buf.includes(Buffer.from("Hello"))); // true  // H 對(duì)應(yīng)的 utf-8 編碼為 72 console.log(buf.includes(72)); // true

indexOf

buf.indexOf(value, [offset], [encoding]) 是用來查找 value 在 buf 中的下標(biāo)的,參數(shù)的含義同 includes 方法相同,如果在 buf 找不到 value,那么會(huì)返回 -1,所以 includes(value) 方法其實(shí)就相當(dāng)于 indexOf(value) !== -1

const buf = Buffer.from("HelloWorld");  console.log(buf.indexOf("H")); // 0 console.log(buf.indexOf("H", 1)); // -1 console.log(buf.indexOf(Buffer.from("World"))); // 5 console.log(buf.indexOf(72)); // 0

equals

buf.equals(otherBuffer) 是比較兩個(gè) Buffer 對(duì)象的字節(jié)是否完全相同,如果相同,則返回 true,否則返回 false

const buf1 = Buffer.alloc(5); const buf2 = Buffer.alloc(5); const buf3 = Buffer.allocUnsafe(5);  console.log(buf1.equals(buf2)); // true console.log(buf1.equals(buf3)); // false

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
噜噜噜久久亚洲精品国产品麻豆| 国产在线视频在线| 日韩 欧美 视频| 999在线精品视频| 老熟妇仑乱视频一区二区| 白白操在线视频| 欧美性视频在线播放| 色综合色综合色综合色综合| 久久国产精品网| 超碰人人爱人人| 欧美日韩一级在线| 99999精品| 97超碰成人在线| 三级视频中文字幕| 无码人妻精品一区二区三区66| 国产一区二区视频播放| 国产免费内射又粗又爽密桃视频| 午夜啪啪免费视频| 不卡中文字幕在线| 一级黄色免费在线观看| 桥本有菜av在线| 女同性恋一区二区| www.69av| 97碰在线视频| 免费无码毛片一区二三区| 日韩人妻无码精品久久久不卡| 成人手机在线播放| www.在线观看av| 欧美极品少妇无套实战| 久久99中文字幕| 亚洲成熟丰满熟妇高潮xxxxx| jizzjizzxxxx| 三年中国国语在线播放免费| 亚洲一级片网站| 久久精品一卡二卡| 成人区一区二区| 女人另类性混交zo| 亚欧激情乱码久久久久久久久| 在线免费看v片| 真实国产乱子伦对白视频| 成年人午夜视频在线观看| 手机看片福利盒子久久| 亚洲精品视频三区| 免费在线看黄色片| 精品少妇无遮挡毛片| 色乱码一区二区三区熟女| 国产精品视频一二三四区| 欧美变态另类刺激| 中文字幕av不卡在线| 国产精品亚洲天堂| 亚洲色欲综合一区二区三区| 伊人色在线视频| 日韩 欧美 视频| 中文字幕在线观看第三页| 日本高清xxxx| 性生活免费在线观看| 国产精品久久久久久久久电影网| 精品久久久噜噜噜噜久久图片 | 日韩精品视频久久| 午夜探花在线观看| 亚洲五月天综合| 人人妻人人澡人人爽欧美一区双| www.超碰com| 国产高清av在线播放| 欧美日韩精品区别| 18岁视频在线观看| 大陆av在线播放| 日韩国产精品毛片| 成人性生交免费看| 国产欧美高清在线| 人妻夜夜添夜夜无码av| 熟女视频一区二区三区| 手机看片福利日韩| 国产精品免费成人| 欧美在线观看www| www.日本三级| 成人在线免费观看网址| 日韩va在线观看| 国产91色在线观看| 99热手机在线| 毛片av免费在线观看| www.日本在线播放| 和岳每晚弄的高潮嗷嗷叫视频| 六月婷婷激情网| 99re8这里只有精品| 日本美女久久久| 拔插拔插华人永久免费| 国产九九热视频| wwwwwxxxx日本| www.色就是色.com| 999久久久精品视频| 亚洲人视频在线| 在线看免费毛片| 日韩精品在线播放视频| 黄色一级视频播放| 韩国黄色一级大片| 日韩一级片一区二区| a级黄色片免费| 欧美精品自拍视频| 免费黄色日本网站| 日韩中文字幕免费在线| 五月婷婷激情久久| 激情五月婷婷基地| 久久久久久久免费视频| 2018国产在线| 免费黄色特级片| 伊人成人222| 捷克做爰xxxⅹ性视频| 老司机午夜网站| 黄色一级视频片| 国产精品久久久毛片| 日本不卡一区二区三区四区| 日韩精品在线观看av| 精品www久久久久奶水| 孩娇小videos精品| 永久免费看av| 日日摸天天爽天天爽视频| 波多野结衣xxxx| 福利视频一区二区三区四区| 欧美激情精品久久久久久小说| 亚洲黄色片免费| 日韩中文字幕在线视频观看 | 超碰影院在线观看| 手机精品视频在线| 国产中文字幕在线免费观看| 三级一区二区三区| 男女视频网站在线观看| 99九九99九九九99九他书对| 日韩一级性生活片| 中文字幕一区二区在线观看视频| 国产精品69久久久| 亚洲欧美一区二区三区不卡| aa视频在线播放| 国产又大又长又粗又黄| 日韩视频第二页| 中文精品无码中文字幕无码专区| 少妇一级淫免费放| 国产精品后入内射日本在线观看| 成人亚洲免费视频| av免费在线播放网站| 欧美一级免费播放| 天天干天天操天天干天天操| 久久久精品三级| 日韩精品视频一区二区在线观看| 日韩精品一区二区三区电影| 在线免费观看av的网站| 少妇人妻互换不带套| 无码人妻丰满熟妇区96| 97视频在线免费| 无码日本精品xxxxxxxxx| 日本77777| 精品综合久久久久| 国产免费999| 亚洲三级视频网站| 亚洲激情在线观看视频| 欧在线一二三四区| 无码精品国产一区二区三区免费| 黄色一级片在线看| 国产成人亚洲综合无码| 小泽玛利亚av在线| 中国老女人av| 国产又粗又猛又爽又黄的网站| 91xxx视频| 影音先锋成人资源网站| 蜜桃视频一区二区在线观看| 91视频成人免费| 99中文字幕在线观看| bt天堂新版中文在线地址| 人人妻人人澡人人爽欧美一区双 | 超级碰在线观看| 日本精品福利视频| 人体内射精一区二区三区| 波多野结衣之无限发射| 国产深夜男女无套内射| 免费黄色特级片| 伊人网在线综合| 久久出品必属精品| 日本福利视频网站| 免费毛片小视频| www.激情小说.com| 黄色aaaaaa| 国产日韩av网站| 中文字幕欧美人妻精品一区| 超碰人人草人人| 老司机激情视频| 日韩中文字幕免费在线| 日本特黄在线观看| 97超碰在线人人| 超碰影院在线观看| 激情五月五月婷婷| 男女高潮又爽又黄又无遮挡| 一区二区三区 日韩| 一级特黄妇女高潮| 国产日韩成人内射视频| 一级网站在线观看| 黄色网页免费在线观看| 日本一二三区在线| 欧美韩国日本在线| 青青草原国产免费| 亚洲五月天综合|