久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

詳解Node.js中Buffer對象的操作(創建、讀寫)

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

詳解Node.js中Buffer對象的操作(創建、讀寫)

Buffer 是 Node.js 的內置類型,它是用來表示內存中一塊區域的,用以保存二進制數據,可以將它看做為一個二進制數組。

Buffer 可以用來表示圖片、視頻這樣的二進制數據,另外我們從文件中讀取到的也是 Buffer 類型的數據,從網絡中接收的數據也是 Buffer 類型的數據,所以學習 Buffer 還是很有必要的。

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

創建 Buffer 對象

alloc

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

  • fill:使用 fill 來填充 Buffer 中的每一個字節
  • encoding:如果 fill 為字符串,那么使用 encoding 來對字符串進行編碼為二進制

當不指定 fill 參數,默認為填充 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) 來分配指定大小的內存,不過不會默認填充 0,其中的內容不確定

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

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

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

from

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

接收一個整形數組,數組中的整數應該在 0~255 之間,超出此范圍的數字將會被截斷

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

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

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

from 方法還可以接收一個 Buffer 對象,它會拷貝傳入的 Buffer 對象中的數據到新的 Buffer 對象中

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

from 方法還可以接收一個對象,當傳入對象,首先會將對象轉化為原始值,然后根據原始值轉化為對應的二進制數組

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

Buffer 對象的屬性

length

通過 length 屬性可以知道 Buffer 數組的長度

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

buffer

Buffer 對象內部實際存儲數據的是一個 ArrayBuffer 的對象,通過 buffer 屬性可以得到這個對象

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

讀 Buffer 對象

本節介紹如何訪問 Buffer 對象中的內容。

下標

在文章的開頭提過,我們可以將 Buffer 對象看做是一個二進制數組,既然是數組,那么就可以通過下標的形式來訪問數組中的內容。

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

它們會以補碼的形式解析字節,返回對應的數字。

readXxx

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

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

迭代器

Buffer 對象的迭代器同數組的迭代器相同,也有三個迭代器,分別是

  • entries
  • keys
  • values

我們通過遍歷迭代器來訪問 Buffer 對象中的內容。

const buf = Buffer.from([3, 4, 2]);  for (let entry of buf.entries()) {   // 數組的一個元素為下標,第二個元素為下標對應的元素   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 對象

本小節講解如何向 Buffer 對象中寫入內容。

下標

我們可以直接通過下標來改變 Buffer 對象中的內容

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

write

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

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

該方法返回已寫入的字節數。

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

writeXxx

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

  • value:要寫入的值
  • offset:偏移量,默認為 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(),分別代表以大端序、小端序寫入。

其他方法

isBuffer

該方法接收一個對象,用來判斷該對象是不是一個 Buffer 對象

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

isEncoding

該方法接收一個代表編碼的字符串,返回 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 對象,返回一個新的 Buffer 對象,其中 start 和 end 代表裁切的起始位置和結束位置,左閉右開 [start, end),這兩個參數是可選的,start 默認為 0,end 默認為 buf.length。返回的 Buffer 對象與原先對象引用的是同一塊內存,即它們的 buffer 屬性是一樣的。

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

subarray

subarray(start, end) 幾乎可以看做等同于 slice 方法了,二者的語義不同,不過行為確實一致的,subarray 的語義表示返回原數組的某個范圍的子數組,而 slice 的語義表示的裁切。同樣 subarray 返回新的 Buffer 對象,并且返回的 Buffer 對象的 buffer 與原 Buffer 對象的 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 的內容復制到 target 從 targetStart 的位置,見下動圖

詳解Node.js中Buffer對象的操作(創建、讀寫)

除了 target 以外,其他三個參數都是可選參數,targetStart 與 sourceStart 的默認值為 0,sourceEnd 的默認值為 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 可以是一個字符串,也可以是一個 Buffer 對象,也可以是一個整數;offset 用來規定查找范圍,表示從 offset 處開始查找,默認為 0;enconding 表示編碼,默認為 utf-8

const buf = Buffer.from("HelloWorld");  // 默認從 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 對應的 utf-8 編碼為 72 console.log(buf.includes(72)); // true

indexOf

buf.indexOf(value, [offset], [encoding]) 是用來查找 value 在 buf 中的下標的,參數的含義同 includes 方法相同,如果在 buf 找不到 value,那么會返回 -1,所以 includes(value) 方法其實就相當于 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) 是比較兩個 Buffer 對象的字節是否完全相同,如果相同,則返回 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)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
亚洲女同av| 国产精品4hu.www| 亚洲欧洲美洲国产香蕉| 久久中文字幕av| 久久久精品久久久久久96| 四虎8848精品成人免费网站| 国产精品久久久久久久久妇女| 美女精品视频在线| 里番精品3d一二三区| 美女在线视频一区| 狂野欧美性猛交xxxx| 久久一区亚洲| 日韩成人三级| 亚洲成av人片一区二区密柚| 国精品一区二区| 日韩午夜高潮| 免费在线观看日韩欧美| 蜜桃视频免费观看一区| 亚洲精品大片| 欧美激情视频一区二区三区免费| 精品三级av| 日韩不卡视频在线观看| 亚洲一级高清| 日韩影院免费视频| 亚洲精品第一| 国产欧美日韩一区二区三区四区 | 国产精品白浆| 国产日韩在线观看视频| 国产精品亲子伦av一区二区三区| 欧美aaaaaa午夜精品| 免费观看亚洲天堂| 91欧美日韩| 亚洲手机在线| 日本在线不卡视频| 精品美女视频 | 欧美天堂视频| 欧美成人午夜| 日韩精品视频一区二区三区| 久久久免费人体| 91久久久精品国产| 亚洲日韩中文字幕一区| 人人爱人人干婷婷丁香亚洲| 美女高潮久久久| 一区二区小说| 欧美日韩xxxx| 亚洲不卡av不卡一区二区| 中文字幕中文字幕精品| 美女久久99| av不卡在线| 蜜桃久久久久| 国产麻豆综合| 麻豆视频一区二区| 国产视频久久| 麻豆精品在线| 免费观看在线综合色| 精品午夜av| 亚洲免费中文| 国产精品对白| 亚洲午夜在线| 免费观看亚洲天堂| 亚洲一区久久| 国产成人精品一区二区三区在线| 亚洲国产日韩欧美在线| 国产精品资源| 亚洲免费观看| 日韩成人免费| 日韩免费精品| 99久精品视频在线观看视频| 国产欧美激情| aⅴ色国产欧美| av在线最新| 天堂精品久久久久| 99热精品久久| 欧美韩一区二区| 蜜臀久久99精品久久久久久9| 91亚洲自偷观看高清| 亚洲1区在线| 激情婷婷久久| 日本欧美国产| 国产日韩欧美三区| 国产模特精品视频久久久久| 蜜桃av.网站在线观看| 国产精品久久久久9999高清| 久久不射网站| 久久久久久久久丰满| 麻豆视频久久| 亚洲精品自拍| 久久精品主播| 精品视频网站| 久久狠狠久久| 亚洲一级大片| 午夜精品亚洲| 色婷婷久久久| 国产v日韩v欧美v| 欧美精品不卡| 日韩精品一级| 蜜桃久久久久久久| 免费精品国产的网站免费观看| 高清一区二区| 美女av一区| 国产精品igao视频网网址不卡日韩| 国产精品嫩草99av在线| 热三久草你在线| 日韩综合一区二区| 日韩一区二区免费看| 成人久久一区| 国产乱码精品一区二区三区四区 | 亚洲在线免费| 色综合www| 高清av一区| 日韩成人a**站| 久久在线91| 欧美日韩一区二区国产| 欧美激情网址| 国产剧情在线观看一区| 亚洲黄页一区| 99精品99| 欧美手机在线| 久久国产麻豆精品| 欧美在线亚洲综合一区| 国产在视频一区二区三区吞精| 国产99在线| 精品黄色一级片| 欧美偷窥清纯综合图区| 亚洲成人一区在线观看| 成人羞羞视频播放网站| 精品一区二区三区的国产在线观看| 国产精品xxx在线观看| 国产成人精品一区二区免费看京| 中文在线中文资源| 亚洲人成精品久久久| 欧美日韩91| 日韩在线电影| 美女黄网久久| 91午夜精品| 日韩va亚洲va欧美va久久| 国产毛片精品| 日韩国产一区二区| 国产不卡一区| 国产一区日韩一区| 在线成人动漫av| 九九综合在线| 午夜欧美精品久久久久久久| 亚洲精品小说| 精品在线99| 最新亚洲国产| 老鸭窝亚洲一区二区三区| 91九色精品| 日韩一区二区三免费高清在线观看| 蜜桃成人av| 国产亚洲一区二区手机在线观看| 成人在线视频区| 日韩精品久久久久久| 欧美xxxx中国| 香蕉视频亚洲一级| 国产v日韩v欧美v| 国产亚洲精aa在线看| 国产一区二区亚洲| 精品久久影院| 欧美a在线观看| 蜜桃视频在线观看一区| 精品国产18久久久久久二百| 免费一级欧美在线观看视频| 蜜臀av性久久久久蜜臀aⅴ流畅| 丝袜国产日韩另类美女| 日本在线成人| 国产欧美一区二区三区米奇 | 黄色成人精品网站| 日本久久一区| 午夜国产精品视频| 日韩一区免费| 麻豆91在线播放| 免费看日韩精品| 成人台湾亚洲精品一区二区| 亚洲一区黄色| 青草av.久久免费一区| 国产日本精品| 精品国产欧美日韩| 亚洲少妇在线| 日韩高清不卡| 久久精品女人| 免费精品国产的网站免费观看| 日韩天堂av| 婷婷激情图片久久| 97精品久久| 久久精品免费一区二区三区 | 国产91在线精品| 国产麻豆精品久久| 三级欧美在线一区| 国产精品日韩久久久| 精品网站999| 亚洲深夜福利在线观看| 亚洲影院天堂中文av色| 国产精品白丝一区二区三区| 日韩精品亚洲专区| 免播放器亚洲| 欧美日韩国产v| 欧美不卡在线| 性欧美长视频| 蜜桃久久av一区|