[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fbuffer":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fbuffer":1628,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fbuffer":1655},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":14,"pinned":15,"draft":15,"body":16,"seo":1624,"stem":1625,"id":1626,"extension":1627},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fbuffer","缓冲区","Buffer 是 Node.js 全局对象，用于处理二进制数据流（如文件、网络数据）。在 ES6 引入 TypedArray 之前，Buffer 是 Node.js 处理二进制的主要方式；现在 Buffer 实现了 Uint8Arra…","技能小册",[12,13],"nodejs","buffer","2025-01-30",false,{"type":17,"value":18,"toc":1614},"minimark",[19,22,27,52,57,146,151,258,273,277,285,307,416,423,449,557,568,591,641,646,727,731,737,743,848,854,857,973,980,986,989,1011,1095,1102,1105,1213,1220,1226,1329,1336,1340,1366,1370,1442,1445,1505,1579,1585,1588,1607,1610],[20,21,8],"h1",{"id":8},[23,24,26],"h2",{"id":25},"nodejs-缓冲区buffer详解","Node.js 缓冲区（Buffer）详解",[28,29,30,34,35,38,39,41,42,44,45,48,49,51],"p",{},[31,32,33],"code",{},"Buffer"," 是 Node.js 全局对象，用于处理二进制数据流（如文件、网络数据）。在 ES6 引入 ",[31,36,37],{},"TypedArray"," 之前，",[31,40,33],{}," 是 Node.js 处理二进制的主要方式；现在 ",[31,43,33],{}," 实现了 ",[31,46,47],{},"Uint8Array"," 接口，并与 ",[31,50,37],{}," 紧密集成。",[53,54,56],"h3",{"id":55},"一buffer-与-uint8array-的关系","一、Buffer 与 Uint8Array 的关系",[58,59,60,91,117],"ul",{},[61,62,63,67,68,70,71,73,74,76,77,79,80,83,84,87,88,90],"li",{},[64,65,66],"strong",{},"继承关系","：",[31,69,33],{}," 是 ",[31,72,47],{}," 的子类。因此，",[31,75,33],{}," 实例具有 ",[31,78,47],{}," 的所有方法（如 ",[31,81,82],{},"forEach","、",[31,85,86],{},"map"," 等），并且可以使用 ",[31,89,47],{}," 的静态方法。",[61,92,93,67,96,98,99,102,103,105,106,108,109,112,113,116],{},[64,94,95],{},"内存分配",[31,97,33],{}," 使用 Node.js 底层的 ",[31,100,101],{},"libuv"," 内存分配策略，而普通 ",[31,104,47],{}," 由 V8 分配。",[31,107,33],{}," 在某些情况下可以申请",[64,110,111],{},"未初始化的内存","（",[31,114,115],{},"allocUnsafe","），性能更高但存在泄露旧数据的风险。",[61,118,119,122,123],{},[64,120,121],{},"适用场景","：\n",[58,124,125,141],{},[61,126,127,129,130,133,134,83,137,140],{},[31,128,33],{},"：专为 Node.js I\u002FO 设计，提供更方便的字符串与二进制转换（如 ",[31,131,132],{},"toString"," 支持多种编码）、",[31,135,136],{},"concat",[31,138,139],{},"compare"," 等方法。",[61,142,143,145],{},[31,144,47],{},"：通用二进制数组，可用于浏览器环境或更底层的数值操作。",[28,147,148,67],{},[64,149,150],{},"相互转换",[152,153,158],"pre",{"className":154,"code":155,"language":156,"meta":157,"style":157},"language-js shiki shiki-themes material-theme-lighter github-light github-dark","const buf = Buffer.from(\"hello\");\nconst uint8 = new Uint8Array(buf); \u002F\u002F 共享同一段内存\nconst buf2 = Buffer.from(uint8); \u002F\u002F 复制数据\n","js","",[31,159,160,208,234],{"__ignoreMap":157},[161,162,165,169,173,177,181,185,189,192,196,200,202,205],"span",{"class":163,"line":164},"line",1,[161,166,168],{"class":167},"sbsja","const",[161,170,172],{"class":171},"s_hVV"," buf",[161,174,176],{"class":175},"smGrS"," =",[161,178,180],{"class":179},"su5hD"," Buffer",[161,182,184],{"class":183},"sP7_E",".",[161,186,188],{"class":187},"sGLFI","from",[161,190,191],{"class":179},"(",[161,193,195],{"class":194},"sjJ54","\"",[161,197,199],{"class":198},"s_sjI","hello",[161,201,195],{"class":194},[161,203,204],{"class":179},")",[161,206,207],{"class":183},";\n",[161,209,211,213,216,218,221,224,227,230],{"class":163,"line":210},2,[161,212,168],{"class":167},[161,214,215],{"class":171}," uint8",[161,217,176],{"class":175},[161,219,220],{"class":175}," new",[161,222,223],{"class":187}," Uint8Array",[161,225,226],{"class":179},"(buf)",[161,228,229],{"class":183},";",[161,231,233],{"class":232},"sutJx"," \u002F\u002F 共享同一段内存\n",[161,235,237,239,242,244,246,248,250,253,255],{"class":163,"line":236},3,[161,238,168],{"class":167},[161,240,241],{"class":171}," buf2",[161,243,176],{"class":175},[161,245,180],{"class":179},[161,247,184],{"class":183},[161,249,188],{"class":187},[161,251,252],{"class":179},"(uint8)",[161,254,229],{"class":183},[161,256,257],{"class":232}," \u002F\u002F 复制数据\n",[28,259,260,67,263,265,266,269,270,272],{},[64,261,262],{},"注意",[31,264,33],{}," 实例的 ",[31,267,268],{},"length"," 是其字节长度，并非元素个数（与 ",[31,271,47],{}," 一致）。",[53,274,276],{"id":275},"二创建-buffer-的方式","二、创建 Buffer 的方式",[278,279,281,282],"h4",{"id":280},"_1-bufferallocsize-fill-encoding","1. ",[31,283,284],{},"Buffer.alloc(size[, fill[, encoding]])",[58,286,287,297],{},[61,288,289,292,293,296],{},[64,290,291],{},"作用","：创建一个指定大小的 Buffer，",[64,294,295],{},"内存会被初始化","（默认填充 0），安全且性能可接受。",[61,298,299,302,303,306],{},[64,300,301],{},"推荐","：始终优先使用 ",[31,304,305],{},"alloc"," 确保数据安全，避免泄漏敏感信息。",[152,308,310],{"className":154,"code":309,"language":156,"meta":157,"style":157},"const buf1 = Buffer.alloc(10); \u002F\u002F 10 字节，全 0\nconst buf2 = Buffer.alloc(10, 0x2a); \u002F\u002F 填充为 0x2a ('*')\nconst buf3 = Buffer.alloc(10, \"a\", \"utf8\"); \u002F\u002F 填充字符 'a'\n",[31,311,312,340,371],{"__ignoreMap":157},[161,313,314,316,319,321,323,325,327,329,333,335,337],{"class":163,"line":164},[161,315,168],{"class":167},[161,317,318],{"class":171}," buf1",[161,320,176],{"class":175},[161,322,180],{"class":179},[161,324,184],{"class":183},[161,326,305],{"class":187},[161,328,191],{"class":179},[161,330,332],{"class":331},"srdBf","10",[161,334,204],{"class":179},[161,336,229],{"class":183},[161,338,339],{"class":232}," \u002F\u002F 10 字节，全 0\n",[161,341,342,344,346,348,350,352,354,356,358,361,364,366,368],{"class":163,"line":210},[161,343,168],{"class":167},[161,345,241],{"class":171},[161,347,176],{"class":175},[161,349,180],{"class":179},[161,351,184],{"class":183},[161,353,305],{"class":187},[161,355,191],{"class":179},[161,357,332],{"class":331},[161,359,360],{"class":183},",",[161,362,363],{"class":331}," 0x2a",[161,365,204],{"class":179},[161,367,229],{"class":183},[161,369,370],{"class":232}," \u002F\u002F 填充为 0x2a ('*')\n",[161,372,373,375,378,380,382,384,386,388,390,392,395,398,400,402,404,407,409,411,413],{"class":163,"line":236},[161,374,168],{"class":167},[161,376,377],{"class":171}," buf3",[161,379,176],{"class":175},[161,381,180],{"class":179},[161,383,184],{"class":183},[161,385,305],{"class":187},[161,387,191],{"class":179},[161,389,332],{"class":331},[161,391,360],{"class":183},[161,393,394],{"class":194}," \"",[161,396,397],{"class":198},"a",[161,399,195],{"class":194},[161,401,360],{"class":183},[161,403,394],{"class":194},[161,405,406],{"class":198},"utf8",[161,408,195],{"class":194},[161,410,204],{"class":179},[161,412,229],{"class":183},[161,414,415],{"class":232}," \u002F\u002F 填充字符 'a'\n",[278,417,419,420],{"id":418},"_2-bufferfromarray","2. ",[31,421,422],{},"Buffer.from(array)",[58,424,425],{},[61,426,427,429,430],{},[64,428,291],{},"：从数组、字符串或其他 Buffer 创建新 Buffer。支持多种输入类型：\n",[58,431,432,438,444],{},[61,433,434,437],{},[31,435,436],{},"Buffer.from(string[, encoding])","：从字符串创建。",[61,439,440,443],{},[31,441,442],{},"Buffer.from(buffer)","：复制现有 Buffer 数据。",[61,445,446,448],{},[31,447,422],{},"：从字节数组（0-255 整数数组）创建。",[152,450,452],{"className":154,"code":451,"language":156,"meta":157,"style":157},"const buf1 = Buffer.from(\"hello\", \"utf8\");\nconst buf2 = Buffer.from([0x68, 0x65, 0x6c, 0x6c, 0x6f]); \u002F\u002F 等价\nconst buf3 = Buffer.from(buf1); \u002F\u002F 新副本\n",[31,453,454,488,535],{"__ignoreMap":157},[161,455,456,458,460,462,464,466,468,470,472,474,476,478,480,482,484,486],{"class":163,"line":164},[161,457,168],{"class":167},[161,459,318],{"class":171},[161,461,176],{"class":175},[161,463,180],{"class":179},[161,465,184],{"class":183},[161,467,188],{"class":187},[161,469,191],{"class":179},[161,471,195],{"class":194},[161,473,199],{"class":198},[161,475,195],{"class":194},[161,477,360],{"class":183},[161,479,394],{"class":194},[161,481,406],{"class":198},[161,483,195],{"class":194},[161,485,204],{"class":179},[161,487,207],{"class":183},[161,489,490,492,494,496,498,500,502,505,508,510,513,515,518,520,522,524,527,530,532],{"class":163,"line":210},[161,491,168],{"class":167},[161,493,241],{"class":171},[161,495,176],{"class":175},[161,497,180],{"class":179},[161,499,184],{"class":183},[161,501,188],{"class":187},[161,503,504],{"class":179},"([",[161,506,507],{"class":331},"0x68",[161,509,360],{"class":183},[161,511,512],{"class":331}," 0x65",[161,514,360],{"class":183},[161,516,517],{"class":331}," 0x6c",[161,519,360],{"class":183},[161,521,517],{"class":331},[161,523,360],{"class":183},[161,525,526],{"class":331}," 0x6f",[161,528,529],{"class":179},"])",[161,531,229],{"class":183},[161,533,534],{"class":232}," \u002F\u002F 等价\n",[161,536,537,539,541,543,545,547,549,552,554],{"class":163,"line":236},[161,538,168],{"class":167},[161,540,377],{"class":171},[161,542,176],{"class":175},[161,544,180],{"class":179},[161,546,184],{"class":183},[161,548,188],{"class":187},[161,550,551],{"class":179},"(buf1)",[161,553,229],{"class":183},[161,555,556],{"class":232}," \u002F\u002F 新副本\n",[278,558,560,561,564,565],{"id":559},"_3-bufferallocunsafesize-allocunsafeslowsize","3. ",[31,562,563],{},"Buffer.allocUnsafe(size)"," \u002F ",[31,566,567],{},"allocUnsafeSlow(size)",[58,569,570,579,585],{},[61,571,572,574,575,578],{},[64,573,291],{},"：分配",[64,576,577],{},"未初始化","的内存，速度快，但可能包含旧数据（敏感信息风险）。需立即写入数据，否则可能泄露。",[61,580,581,584],{},[64,582,583],{},"使用场景","：性能极端敏感且能确保立即覆写全部字节时。",[61,586,587,590],{},[64,588,589],{},"风险","：未初始化的内存片段可能包含密码、密钥等，必须小心使用。",[152,592,594],{"className":154,"code":593,"language":156,"meta":157,"style":157},"const buf = Buffer.allocUnsafe(1024);\nbuf.fill(0); \u002F\u002F 立即填充以避免泄露\n",[31,595,596,619],{"__ignoreMap":157},[161,597,598,600,602,604,606,608,610,612,615,617],{"class":163,"line":164},[161,599,168],{"class":167},[161,601,172],{"class":171},[161,603,176],{"class":175},[161,605,180],{"class":179},[161,607,184],{"class":183},[161,609,115],{"class":187},[161,611,191],{"class":179},[161,613,614],{"class":331},"1024",[161,616,204],{"class":179},[161,618,207],{"class":183},[161,620,621,624,626,629,631,634,636,638],{"class":163,"line":210},[161,622,623],{"class":179},"buf",[161,625,184],{"class":183},[161,627,628],{"class":187},"fill",[161,630,191],{"class":179},[161,632,633],{"class":331},"0",[161,635,204],{"class":179},[161,637,229],{"class":183},[161,639,640],{"class":232}," \u002F\u002F 立即填充以避免泄露\n",[28,642,643,67],{},[64,644,645],{},"对比",[647,648,649,671],"table",{},[650,651,652],"thead",{},[653,654,655,659,662,665,668],"tr",{},[656,657,658],"th",{},"方法",[656,660,661],{},"初始化",[656,663,664],{},"性能",[656,666,667],{},"安全性",[656,669,670],{},"推荐程度",[672,673,674,693,709],"tbody",{},[653,675,676,681,684,687,690],{},[677,678,679],"td",{},[31,680,305],{},[677,682,683],{},"是（填 0）",[677,685,686],{},"中等",[677,688,689],{},"高",[677,691,692],{},"默认首选",[653,694,695,699,702,704,706],{},[677,696,697],{},[31,698,188],{},[677,700,701],{},"取决于源",[677,703,686],{},[677,705,689],{},[677,707,708],{},"从现有数据创建",[653,710,711,715,718,721,724],{},[677,712,713],{},[31,714,115],{},[677,716,717],{},"否",[677,719,720],{},"最快",[677,722,723],{},"低（需谨慎）",[677,725,726],{},"仅特殊优化场景",[53,728,730],{"id":729},"三常用方法","三、常用方法",[278,732,281,734],{"id":733},"_1-buftostringencoding-start-end",[31,735,736],{},"buf.toString([encoding[, start[, end]]])",[28,738,739,740,742],{},"将 Buffer 解码为字符串，默认 ",[31,741,406],{}," 编码。可指定起始\u002F结束位置。",[152,744,746],{"className":154,"code":745,"language":156,"meta":157,"style":157},"const buf = Buffer.from(\"Node.js 缓冲区\");\nconsole.log(buf.toString(\"utf8\", 0, 5)); \u002F\u002F \"Node.\"\nconsole.log(buf.toString(\"hex\")); \u002F\u002F 十六进制表示\n",[31,747,748,775,818],{"__ignoreMap":157},[161,749,750,752,754,756,758,760,762,764,766,769,771,773],{"class":163,"line":164},[161,751,168],{"class":167},[161,753,172],{"class":171},[161,755,176],{"class":175},[161,757,180],{"class":179},[161,759,184],{"class":183},[161,761,188],{"class":187},[161,763,191],{"class":179},[161,765,195],{"class":194},[161,767,768],{"class":198},"Node.js 缓冲区",[161,770,195],{"class":194},[161,772,204],{"class":179},[161,774,207],{"class":183},[161,776,777,780,782,785,788,790,792,794,796,798,800,802,805,807,810,813,815],{"class":163,"line":210},[161,778,779],{"class":179},"console",[161,781,184],{"class":183},[161,783,784],{"class":187},"log",[161,786,787],{"class":179},"(buf",[161,789,184],{"class":183},[161,791,132],{"class":187},[161,793,191],{"class":179},[161,795,195],{"class":194},[161,797,406],{"class":198},[161,799,195],{"class":194},[161,801,360],{"class":183},[161,803,804],{"class":331}," 0",[161,806,360],{"class":183},[161,808,809],{"class":331}," 5",[161,811,812],{"class":179},"))",[161,814,229],{"class":183},[161,816,817],{"class":232}," \u002F\u002F \"Node.\"\n",[161,819,820,822,824,826,828,830,832,834,836,839,841,843,845],{"class":163,"line":236},[161,821,779],{"class":179},[161,823,184],{"class":183},[161,825,784],{"class":187},[161,827,787],{"class":179},[161,829,184],{"class":183},[161,831,132],{"class":187},[161,833,191],{"class":179},[161,835,195],{"class":194},[161,837,838],{"class":198},"hex",[161,840,195],{"class":194},[161,842,812],{"class":179},[161,844,229],{"class":183},[161,846,847],{"class":232}," \u002F\u002F 十六进制表示\n",[278,849,419,851],{"id":850},"_2-bufferconcatlist-totallength",[31,852,853],{},"Buffer.concat(list[, totalLength])",[28,855,856],{},"将多个 Buffer 拼接成一个新 Buffer，高效合并。",[152,858,860],{"className":154,"code":859,"language":156,"meta":157,"style":157},"const bufs = [Buffer.from(\"Hello\"), Buffer.from(\" \"), Buffer.from(\"World\")];\nconst result = Buffer.concat(bufs); \u002F\u002F \u003CBuffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>\nconsole.log(result.toString()); \u002F\u002F \"Hello World\"\n",[31,861,862,927,950],{"__ignoreMap":157},[161,863,864,866,869,871,874,876,878,880,882,885,887,889,891,893,895,897,899,901,903,905,907,909,911,913,915,917,920,922,925],{"class":163,"line":164},[161,865,168],{"class":167},[161,867,868],{"class":171}," bufs",[161,870,176],{"class":175},[161,872,873],{"class":179}," [Buffer",[161,875,184],{"class":183},[161,877,188],{"class":187},[161,879,191],{"class":179},[161,881,195],{"class":194},[161,883,884],{"class":198},"Hello",[161,886,195],{"class":194},[161,888,204],{"class":179},[161,890,360],{"class":183},[161,892,180],{"class":179},[161,894,184],{"class":183},[161,896,188],{"class":187},[161,898,191],{"class":179},[161,900,195],{"class":194},[161,902,394],{"class":194},[161,904,204],{"class":179},[161,906,360],{"class":183},[161,908,180],{"class":179},[161,910,184],{"class":183},[161,912,188],{"class":187},[161,914,191],{"class":179},[161,916,195],{"class":194},[161,918,919],{"class":198},"World",[161,921,195],{"class":194},[161,923,924],{"class":179},")]",[161,926,207],{"class":183},[161,928,929,931,934,936,938,940,942,945,947],{"class":163,"line":210},[161,930,168],{"class":167},[161,932,933],{"class":171}," result",[161,935,176],{"class":175},[161,937,180],{"class":179},[161,939,184],{"class":183},[161,941,136],{"class":187},[161,943,944],{"class":179},"(bufs)",[161,946,229],{"class":183},[161,948,949],{"class":232}," \u002F\u002F \u003CBuffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>\n",[161,951,952,954,956,958,961,963,965,968,970],{"class":163,"line":236},[161,953,779],{"class":179},[161,955,184],{"class":183},[161,957,784],{"class":187},[161,959,960],{"class":179},"(result",[161,962,184],{"class":183},[161,964,132],{"class":187},[161,966,967],{"class":179},"())",[161,969,229],{"class":183},[161,971,972],{"class":232}," \u002F\u002F \"Hello World\"\n",[28,974,975,976,979],{},"若已知总长度，可传入 ",[31,977,978],{},"totalLength"," 优化性能。",[278,981,560,983],{"id":982},"_3-bufcomparetarget-targetstart-targetend-sourcestart-sourceend",[31,984,985],{},"buf.compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])",[28,987,988],{},"比较两个 Buffer 的字节顺序，常用于排序：",[58,990,991],{},[61,992,993,994,996,997,1000,1001,1003,1004,38,1007,1010],{},"返回 ",[31,995,633],{}," 相等，",[31,998,999],{},"\u003C 0"," 表示 ",[31,1002,623],{}," 在 ",[31,1005,1006],{},"target",[31,1008,1009],{},"> 0"," 在后面。",[152,1012,1014],{"className":154,"code":1013,"language":156,"meta":157,"style":157},"const a = Buffer.from(\"abc\");\nconst b = Buffer.from(\"abd\");\nconsole.log(a.compare(b)); \u002F\u002F -1 (因为 'c' \u003C 'd')\n",[31,1015,1016,1044,1072],{"__ignoreMap":157},[161,1017,1018,1020,1023,1025,1027,1029,1031,1033,1035,1038,1040,1042],{"class":163,"line":164},[161,1019,168],{"class":167},[161,1021,1022],{"class":171}," a",[161,1024,176],{"class":175},[161,1026,180],{"class":179},[161,1028,184],{"class":183},[161,1030,188],{"class":187},[161,1032,191],{"class":179},[161,1034,195],{"class":194},[161,1036,1037],{"class":198},"abc",[161,1039,195],{"class":194},[161,1041,204],{"class":179},[161,1043,207],{"class":183},[161,1045,1046,1048,1051,1053,1055,1057,1059,1061,1063,1066,1068,1070],{"class":163,"line":210},[161,1047,168],{"class":167},[161,1049,1050],{"class":171}," b",[161,1052,176],{"class":175},[161,1054,180],{"class":179},[161,1056,184],{"class":183},[161,1058,188],{"class":187},[161,1060,191],{"class":179},[161,1062,195],{"class":194},[161,1064,1065],{"class":198},"abd",[161,1067,195],{"class":194},[161,1069,204],{"class":179},[161,1071,207],{"class":183},[161,1073,1074,1076,1078,1080,1083,1085,1087,1090,1092],{"class":163,"line":236},[161,1075,779],{"class":179},[161,1077,184],{"class":183},[161,1079,784],{"class":187},[161,1081,1082],{"class":179},"(a",[161,1084,184],{"class":183},[161,1086,139],{"class":187},[161,1088,1089],{"class":179},"(b))",[161,1091,229],{"class":183},[161,1093,1094],{"class":232}," \u002F\u002F -1 (因为 'c' \u003C 'd')\n",[278,1096,1098,1099],{"id":1097},"_4-bufcopytarget-targetstart-sourcestart-sourceend","4. ",[31,1100,1101],{},"buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])",[28,1103,1104],{},"将 Buffer 中的数据复制到另一个 Buffer，不创建新 Buffer。",[152,1106,1108],{"className":154,"code":1107,"language":156,"meta":157,"style":157},"const src = Buffer.from(\"Hello World\");\nconst dst = Buffer.alloc(5);\nsrc.copy(dst, 0, 0, 5);\nconsole.log(dst.toString()); \u002F\u002F \"Hello\"\n",[31,1109,1110,1138,1162,1191],{"__ignoreMap":157},[161,1111,1112,1114,1117,1119,1121,1123,1125,1127,1129,1132,1134,1136],{"class":163,"line":164},[161,1113,168],{"class":167},[161,1115,1116],{"class":171}," src",[161,1118,176],{"class":175},[161,1120,180],{"class":179},[161,1122,184],{"class":183},[161,1124,188],{"class":187},[161,1126,191],{"class":179},[161,1128,195],{"class":194},[161,1130,1131],{"class":198},"Hello World",[161,1133,195],{"class":194},[161,1135,204],{"class":179},[161,1137,207],{"class":183},[161,1139,1140,1142,1145,1147,1149,1151,1153,1155,1158,1160],{"class":163,"line":210},[161,1141,168],{"class":167},[161,1143,1144],{"class":171}," dst",[161,1146,176],{"class":175},[161,1148,180],{"class":179},[161,1150,184],{"class":183},[161,1152,305],{"class":187},[161,1154,191],{"class":179},[161,1156,1157],{"class":331},"5",[161,1159,204],{"class":179},[161,1161,207],{"class":183},[161,1163,1164,1167,1169,1172,1175,1177,1179,1181,1183,1185,1187,1189],{"class":163,"line":236},[161,1165,1166],{"class":179},"src",[161,1168,184],{"class":183},[161,1170,1171],{"class":187},"copy",[161,1173,1174],{"class":179},"(dst",[161,1176,360],{"class":183},[161,1178,804],{"class":331},[161,1180,360],{"class":183},[161,1182,804],{"class":331},[161,1184,360],{"class":183},[161,1186,809],{"class":331},[161,1188,204],{"class":179},[161,1190,207],{"class":183},[161,1192,1194,1196,1198,1200,1202,1204,1206,1208,1210],{"class":163,"line":1193},4,[161,1195,779],{"class":179},[161,1197,184],{"class":183},[161,1199,784],{"class":187},[161,1201,1174],{"class":179},[161,1203,184],{"class":183},[161,1205,132],{"class":187},[161,1207,967],{"class":179},[161,1209,229],{"class":183},[161,1211,1212],{"class":232}," \u002F\u002F \"Hello\"\n",[278,1214,1216,1217],{"id":1215},"_5-bufslicestart-end","5. ",[31,1218,1219],{},"buf.slice([start[, end]])",[28,1221,1222,1223,1225],{},"返回指向同一段内存的新 Buffer（浅拷贝）。",[64,1224,262],{},"：修改切片会影响原 Buffer。",[152,1227,1229],{"className":154,"code":1228,"language":156,"meta":157,"style":157},"const original = Buffer.from(\"abcdefg\");\nconst sliced = original.slice(1, 4); \u002F\u002F bcd\nsliced[0] = 0x7a; \u002F\u002F 修改切片会影响 original\nconsole.log(original); \u002F\u002F \u003CBuffer 61 7a 63 64 65 66 67> (a z c d e f g)\n",[31,1230,1231,1259,1292,1313],{"__ignoreMap":157},[161,1232,1233,1235,1238,1240,1242,1244,1246,1248,1250,1253,1255,1257],{"class":163,"line":164},[161,1234,168],{"class":167},[161,1236,1237],{"class":171}," original",[161,1239,176],{"class":175},[161,1241,180],{"class":179},[161,1243,184],{"class":183},[161,1245,188],{"class":187},[161,1247,191],{"class":179},[161,1249,195],{"class":194},[161,1251,1252],{"class":198},"abcdefg",[161,1254,195],{"class":194},[161,1256,204],{"class":179},[161,1258,207],{"class":183},[161,1260,1261,1263,1266,1268,1270,1272,1275,1277,1280,1282,1285,1287,1289],{"class":163,"line":210},[161,1262,168],{"class":167},[161,1264,1265],{"class":171}," sliced",[161,1267,176],{"class":175},[161,1269,1237],{"class":179},[161,1271,184],{"class":183},[161,1273,1274],{"class":187},"slice",[161,1276,191],{"class":179},[161,1278,1279],{"class":331},"1",[161,1281,360],{"class":183},[161,1283,1284],{"class":331}," 4",[161,1286,204],{"class":179},[161,1288,229],{"class":183},[161,1290,1291],{"class":232}," \u002F\u002F bcd\n",[161,1293,1294,1297,1299,1302,1305,1308,1310],{"class":163,"line":236},[161,1295,1296],{"class":179},"sliced[",[161,1298,633],{"class":331},[161,1300,1301],{"class":179},"] ",[161,1303,1304],{"class":175},"=",[161,1306,1307],{"class":331}," 0x7a",[161,1309,229],{"class":183},[161,1311,1312],{"class":232}," \u002F\u002F 修改切片会影响 original\n",[161,1314,1315,1317,1319,1321,1324,1326],{"class":163,"line":1193},[161,1316,779],{"class":179},[161,1318,184],{"class":183},[161,1320,784],{"class":187},[161,1322,1323],{"class":179},"(original)",[161,1325,229],{"class":183},[161,1327,1328],{"class":232}," \u002F\u002F \u003CBuffer 61 7a 63 64 65 66 67> (a z c d e f g)\n",[28,1330,1331,1332,1335],{},"若需独立副本，可对切片调用 ",[31,1333,1334],{},"Buffer.from(sliced)","。",[278,1337,1339],{"id":1338},"_6-其他常用方法","6. 其他常用方法",[58,1341,1342,1348,1354,1360],{},[61,1343,1344,1347],{},[31,1345,1346],{},"buf.length","：Buffer 的字节数（注意不是字符数，例如中文字符占 3 字节）。",[61,1349,1350,1353],{},[31,1351,1352],{},"buf.fill(value[, offset[, end]])","：填充 Buffer。",[61,1355,1356,1359],{},[31,1357,1358],{},"buf.indexOf(value[, byteOffset])","：查找指定内容的位置。",[61,1361,1362,1365],{},[31,1363,1364],{},"buf.equals(otherBuffer)","：判断两个 Buffer 内容是否完全相同。",[53,1367,1369],{"id":1368},"四性能与安全注意事项","四、性能与安全注意事项",[1371,1372,1373,1389,1398,1415],"ol",{},[61,1374,1375,1385,1386,1388],{},[64,1376,1377,1378,1381,1382],{},"优先使用 ",[31,1379,1380],{},"Buffer.alloc"," 和 ",[31,1383,1384],{},"Buffer.from","，避免 ",[31,1387,115],{}," 除非你确切知道风险并立即覆写。",[61,1390,1391,1397],{},[64,1392,1393,1394],{},"不要使用 ",[31,1395,1396],{},"new Buffer(size)","，该构造函数已废弃，行为不可预测。",[61,1399,1400,1403,1404,1406,1407,1410,1411,1414],{},[64,1401,1402],{},"处理大文件或网络数据时","，使用 ",[31,1405,33],{}," 配合流（",[31,1408,1409],{},"stream","）和 ",[31,1412,1413],{},"StringDecoder"," 处理多字节字符（如 UTF-8 中文字符可能被分割）。",[61,1416,1417,1423,1424,70,1426,1428,1429,1431,1432,1434,1435,83,1438,1441],{},[64,1418,1419,1420,1422],{},"与 ",[31,1421,47],{}," 互操作时","，注意 ",[31,1425,33],{},[31,1427,47],{}," 的子类，但有些 ",[31,1430,37],{}," 方法可能未在 ",[31,1433,33],{}," 上重写（如 ",[31,1436,1437],{},"set",[31,1439,1440],{},"subarray","），建议转换后使用。",[53,1443,1444],{"id":1444},"总结表",[647,1446,1447,1461],{},[650,1448,1449],{},[653,1450,1451,1454,1457,1459],{},[656,1452,1453],{},"创建方式",[656,1455,1456],{},"安全",[656,1458,664],{},[656,1460,121],{},[672,1462,1463,1477,1490],{},[653,1464,1465,1469,1471,1474],{},[677,1466,1467],{},[31,1468,1380],{},[677,1470,689],{},[677,1472,1473],{},"中",[677,1475,1476],{},"日常使用，默认选择",[653,1478,1479,1483,1485,1487],{},[677,1480,1481],{},[31,1482,1384],{},[677,1484,689],{},[677,1486,1473],{},[677,1488,1489],{},"从字符串\u002F数组\u002F现有 Buffer 创建",[653,1491,1492,1497,1500,1502],{},[677,1493,1494],{},[31,1495,1496],{},"Buffer.allocUnsafe",[677,1498,1499],{},"低",[677,1501,689],{},[677,1503,1504],{},"对性能极致要求且能立即填充的场景",[647,1506,1507,1519],{},[650,1508,1509],{},[653,1510,1511,1513,1516],{},[656,1512,658],{},[656,1514,1515],{},"功能",[656,1517,1518],{},"是否修改原 Buffer",[672,1520,1521,1532,1544,1555,1567],{},[653,1522,1523,1527,1530],{},[677,1524,1525],{},[31,1526,132],{},[677,1528,1529],{},"解码为字符串",[677,1531,717],{},[653,1533,1534,1538,1541],{},[677,1535,1536],{},[31,1537,136],{},[677,1539,1540],{},"合并多个 Buffer",[677,1542,1543],{},"否（返回新 Buffer）",[653,1545,1546,1550,1553],{},[677,1547,1548],{},[31,1549,139],{},[677,1551,1552],{},"比较字节顺序",[677,1554,717],{},[653,1556,1557,1561,1564],{},[677,1558,1559],{},[31,1560,1171],{},[677,1562,1563],{},"复制数据到目标",[677,1565,1566],{},"是（修改目标 Buffer）",[653,1568,1569,1573,1576],{},[677,1570,1571],{},[31,1572,1274],{},[677,1574,1575],{},"创建共享内存视图",[677,1577,1578],{},"否（但修改视图会影响原 Buffer）",[28,1580,1581,1584],{},[64,1582,1583],{},"学习建议","：结合 Node.js 文档和实际项目（如文件上传、socket 数据处理）来理解 Buffer 的使用，同时注意字符编码问题（特别是 UTF-8 的多字节字符）。",[23,1586,1587],{"id":1587},"推荐参考资料",[58,1589,1590,1598,1601],{},[61,1591,1592,1593],{},"Node.js 官方文档：",[397,1594,33],{"href":1595,"rel":1596},"https:\u002F\u002Fnodejs.org\u002Fapi\u002Fbuffer.html",[1597],"nofollow",[61,1599,1600],{},"《深入浅出 Node.js》相关章节",[61,1602,1603,1604,1606],{},"线上工具：使用 ",[31,1605,838],{}," 编码查看 Buffer 原始字节",[28,1608,1609],{},"掌握 Buffer 是编写高性能 Node.js 网络与文件应用的基础。",[1611,1612,1613],"style",{},"html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":157,"searchDepth":210,"depth":210,"links":1615},[1616,1623],{"id":25,"depth":210,"text":26,"children":1617},[1618,1619,1620,1621,1622],{"id":55,"depth":236,"text":56},{"id":275,"depth":236,"text":276},{"id":729,"depth":236,"text":730},{"id":1368,"depth":236,"text":1369},{"id":1444,"depth":236,"text":1444},{"id":1587,"depth":210,"text":1587},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fend\u002FNodeJs\u002Fcore\u002Fbuffer","knowledge\u002Fknowledge\u002Fbooklet\u002Fend\u002FNodeJs\u002Fcore\u002Fbuffer.md","md",{"items":1629},[1630,1635,1639,1643,1647,1651],{"path":1631,"title":1632,"description":1633,"category":10,"score":1634},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Ffs","文件系统","Node.js 的 fs 模块提供了与文件系统交互的 API，几乎涵盖了所有标准文件操作。它支持三种风格的 API：同步、回调式异步 和 Promise 式异步。下面详细介绍这些 API 的选择策略、流式读写、文件监视以及常用操作。",6,{"path":1636,"title":1637,"description":1638,"category":10,"score":1634},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fpath","路径处理","path 模块提供了用于处理和转换文件路径的实用工具。它是 Node.js 核心模块，无需安装即可直接使用。由于不同操作系统（Windows、Linux、macOS）的路径分隔符不同（Windows 使用反斜杠 \\，POSIX 使用正…",{"path":1640,"title":1641,"description":1642,"category":10,"score":1634},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fprocess","进程与子进程","Node.js 在单个进程中运行，但通过 process 对象、child_process 模块及 worker_threads 模块提供了对进程的精细控制以及多进程\u002F多线程能力。下面从三个方面展开。",{"path":1644,"title":1645,"description":1646,"category":10,"score":1634},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fhttp","网络编程","Node.js 提供了丰富的内置模块，用于构建网络应用。下面从 HTTP\u002FHTTPS、WebSocket、TCP\u002FUDP 以及 DNS 解析四个方面进行深入介绍。",{"path":1648,"title":1649,"description":1650,"category":10,"score":1634},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fstream","流","流是 Node.js 中处理有序数据的抽象接口，用于以连续方式异步读取或写入数据。它们特别适合处理大文件、网络通信或任何可能无限产生的数据。Node.js 内置的 stream 模块提供了四种基本流类型，以及用于组合和错误处理的工具函数。",{"path":1652,"title":1653,"description":1654,"category":10,"score":1634},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fother","其他常用模块","以下是 Node.js 中几个重要内置模块的详细介绍，涵盖事件触发器、定时器、加密、压缩、操作系统信息和实用工具。",{"series":1656,"title":1657,"items":1658,"index":1672,"prev":1673,"next":1674},"booklet\u002Fend\u002Fnodejs\u002Fcore","core",[1659,1660,1662,1664,1666,1668,1670],{"path":7,"title":8,"date":14,"pinned":15},{"path":1631,"title":1632,"date":1661,"pinned":15},"2026-06-04",{"path":1644,"title":1645,"date":1663,"pinned":15},"2023-01-27",{"path":1652,"title":1653,"date":1665,"pinned":15},"2020-03-27",{"path":1636,"title":1637,"date":1667,"pinned":15},"2024-03-14",{"path":1640,"title":1641,"date":1669,"pinned":15},"2023-11-10",{"path":1648,"title":1649,"date":1671,"pinned":15},"2022-05-03",0,null,{"path":1631,"title":1632,"date":1661,"pinned":15}]