前端二進制數據指南:從 ArrayBuffer 到高級流處理

前端開發中,二進制數據是處理文件、圖像、音視頻、網絡通信等場景的基礎。以下是核心概念和用途的通俗解釋:

前端二進制數據介紹

1. 什么是前端二進制數據?

指計算機原始的?0?和?1?格式的數據(比如一張圖片的底層代碼),前端通過特定 API 操作這些數據。


2. 核心用途

  • 文件操作
    上傳/下載文件(如用戶傳圖片)、切片大文件(斷點續傳)。

  • 圖像處理
    修改圖片像素(濾鏡、裁剪)、Canvas 繪圖。

  • 網絡通信
    WebSocket 傳輸二進制幀、AJAX 上傳二進制數據。

  • 高性能計算
    WebAssembly 運行編譯型代碼(如游戲、加密算法)。


3. 關鍵 API 速覽

API作用示例場景
ArrayBuffer存儲原始二進制數據文件解析、網絡數據接收
Uint8Array按字節操作數據(8位無符號整數)圖像像素處理
Blob表示文件類數據(不可變)文件分片上傳
FileReader讀取本地文件內容圖片預覽(轉Base64)
Canvas操作圖像像素數據實時濾鏡效果

4. 為什么需要二進制操作?

  • 性能更高:直接操作內存,比文本處理快。

  • 功能更強:實現文件編輯、音視頻解碼等復雜功能。

  • 節省帶寬:二進制比文本格式(如JSON)體積更小。

前端二進制數據核心類型對比表

類型/API繼承關系使用場景核心優勢
ArrayBuffer基礎容器,無繼承關系存儲原始二進制數據,如網絡傳輸、文件解析、WebAssembly 內存操作直接操作內存,性能極高
TypedArray基于?ArrayBuffer?的視圖(如?Uint8Array類型化數據處理(圖像像素、音頻采樣、網絡協議解析)類型明確,自動處理字節對齊,簡化操作
DataView基于?ArrayBuffer?的視圖處理混合數據類型或需要控制字節序的場景(如解析二進制文件格式、網絡協議)靈活讀寫不同數據類型,支持手動控制字節序
Blob無繼承關系處理不可變的類文件數據(文件分片上傳、生成臨時 URL)支持大文件分片(Blob.slice()),可直接用于?fetch?或?FormData
File繼承自?Blob表示用戶上傳的本地文件(通過?<input type="file">?獲取)包含文件名、類型、修改時間等元信息
FileReader無繼承關系異步讀取?Blob?或?File?內容(轉為?ArrayBufferDataURL、文本等)支持多種讀取格式,兼容瀏覽器文件操作
ImageData包含?Uint8ClampedArray操作 Canvas 像素數據(圖像濾鏡、特效處理)直接映射到 Canvas 像素,RGBA 格式標準化
Streams API基于?ReadableStream/WritableStream流式處理大文件(如視頻分塊加載、實時數據傳輸)分塊處理數據,避免內存溢出,提升性能
WebAssembly通過?ArrayBuffer?加載模塊高性能計算(游戲、音視頻編碼、密碼學算法)接近原生代碼性能,支持 C/C++/Rust 編譯運行

二進制數據核心類型關鍵關聯說明

  1. 繼承鏈

    • File?→?Blob?→ 所有文件相關操作基于?Blob?擴展。

    • TypedArray/DataView?→?ArrayBuffer?→ 所有類型化操作依賴原始二進制緩沖區。

  2. 協作流程示例

    • 文件上傳
      File?→?FileReader?→?ArrayBuffer?→?TypedArray(處理數據) →?fetch?上傳。

    • 圖像處理
      Blob?→?Image?→?Canvas?→?ImageData(像素操作) → 顯示結果。

    • WebAssembly
      .wasm?→?ArrayBuffer?→ 編譯實例化 → 調用高性能函數。

?快速對比示例

// 1. Blob → ArrayBuffer → TypedArray
const blob = new Blob([new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f])]); // "Hello"
blob.arrayBuffer().then(buffer => {const uint8 = new Uint8Array(buffer);console.log(uint8); // Uint8Array(5) [72, 101, 108, 108, 111]
});// 2. File → FileReader → ArrayBuffer
const fileInput = document.querySelector('input[type="file"]');
fileInput.addEventListener('change', (e) => {const file = e.target.files[0];const reader = new FileReader();reader.onload = () => {const buffer = reader.result;const dataView = new DataView(buffer);console.log("文件頭:", dataView.getUint32(0));};reader.readAsArrayBuffer(file);
});

二進制數據核心類型總結

  • 底層核心ArrayBuffer?是二進制操作的基礎,其他類型均圍繞它擴展。

  • 文件處理Blob?和?File?用于文件級操作,FileReader?提供讀取能力。

  • 數據視圖TypedArray?和?DataView?提供靈活的內存操作方式。

  • 高性能場景WebAssembly?和?Streams API?解決計算和流式處理需求。

前端常用二進制數據介紹

1. ArrayBuffer

作用:最基礎的二進制數據容器,表示通用的、固定長度的原始二進制數據緩沖區,不能直接操作,需通過?TypedArray?或?DataView?訪問
優勢:直接操作內存,性能極高,適合處理音頻、視頻等二進制數據。
使用場景:網絡傳輸、文件解析、WebAssembly 內存操作。

區分:Buffer是Node.js 特有的二進制類型(等同于 Uint8Array),前端通常通過瀏覽器 API 或工具庫(如 buffer polyfill)使用

<!DOCTYPE html>
<html>
<head><title>ArrayBuffer 示例</title>
</head>
<body><script>// 1. 創建一個 16 字節的 ArrayBufferconst buffer = new ArrayBuffer(16);// 2. 使用 TypedArray 操作數據const int32View = new Int32Array(buffer); // 每個元素占 4 字節int32View[0] = 42;                        // 寫入數據int32View[1] = 1024;// 3. 通過另一個視圖驗證數據const uint8View = new Uint8Array(buffer);console.log("ArrayBuffer 內容(十六進制):");for (let i = 0; i < uint8View.length; i++) {console.log(uint8View[i].toString(16).padStart(2, '0'));}</script>
</body>
</html>

2. TypedArray

作用

  • 基于?ArrayBuffer?的視圖,提供特定類型的二進制數據操作,包括:

    • Int8ArrayUint8Array(無符號字節)

    • Uint8ClampedArray(限制在 0-255,常用于圖像處理)

    • Int16ArrayUint16Array

    • Int32ArrayUint32Array

    • Float32ArrayFloat64Array

    • BigInt64ArrayBigUint64Array(ES2020 引入,用于大整數)

優勢:類型明確,無需手動處理字節細節。
使用場景:圖像像素操作、音頻數據處理。

<!DOCTYPE html>
<html>
<head><title>TypedArray 示例</title>
</head>
<body><script>// 1. 創建一個 4 字節的 ArrayBufferconst buffer = new ArrayBuffer(4);// 2. 使用不同類型視圖操作同一 bufferconst uint8View = new Uint8Array(buffer);uint8View[0] = 0x12;  // 寫入字節數據uint8View[1] = 0x34;const uint16View = new Uint16Array(buffer);console.log("Uint16 視圖的值:", uint16View[0].toString(16)); // 輸出 3412(小端序)const uint32View = new Uint32Array(buffer);console.log("Uint32 視圖的值:", uint32View[0].toString(16)); // 輸出 34120000</script>
</body>
</html>

3. DataView

作用:靈活讀寫 ArrayBuffer,支持混合數據類型和字節序控制。
優勢:處理復雜二進制格式時更靈活。
使用場景:解析自定義協議、處理網絡數據包

<!DOCTYPE html>
<html>
<head><title>DataView 示例</title>
</head>
<body><script>// 1. 創建一個 8 字節的 ArrayBufferconst buffer = new ArrayBuffer(8);const view = new DataView(buffer);// 2. 寫入不同數據類型(大端序)view.setInt32(0, 0x12345678, false);  // 大端序寫入 4 字節整數view.setFloat32(4, Math.PI, false);   // 大端序寫入浮點數// 3. 讀取數據console.log("整數:", view.getInt32(0, false).toString(16));console.log("浮點數:", view.getFloat32(4, false));</script>
</body>
</html>

4. Blob (Binary Large Object)

作用:不可變的類文件對象,常用于文件切片(slice())、下載或上傳(如 fetch 的 FormData)
優勢:適合處理大文件,可直接用于網絡請求。
使用場景:文件下載、圖片預覽。

<!DOCTYPE html>
<html>
<body><button onclick="downloadFile()">下載 Blob 文件</button><script>function downloadFile() {// 1. 創建 Blob 內容const text = "Hello, Blob!";const blob = new Blob([text], { type: 'text/plain' });// 2. 生成臨時 URL 并下載const url = URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = 'example.txt';a.click();URL.revokeObjectURL(url);}</script>
</body>
</html>

5. File 和 FileReader

File作用:讀取用戶本地文件內容,繼承自 Blob,表示用戶本地文件(通過 <input type="file"> 獲取),包含文件名、類型等元數據

FileReader作用:用于異步讀取?Blob?或?File?內容為?ArrayBufferDataURL?或文本
優勢:直接獲取文件元數據,支持異步讀取。
使用場景:文件上傳、圖片預覽。

<!DOCTYPE html>
<html>
<body><input type="file" id="fileInput"><div id="output"></div><script>document.getElementById('fileInput').addEventListener('change', function(e) {const file = e.target.files[0];const reader = new FileReader();// 1. 讀取為文本reader.readAsText(file);reader.onload = () => {document.getElementById('output').innerHTML = `<p>文件名: ${file.name}</p><p>大小: ${file.size} 字節</p><p>內容: ${reader.result}</p>`;};});</script>
</body>
</html>

6. ImageData 和 Canvas

作用:操作 Canvas 的像素數據。
優勢:直接修改圖像像素,實現實時效果。
使用場景:圖像濾鏡、實時視頻處理。

<!DOCTYPE html>
<html>
<body><canvas id="canvas" width="200" height="200"></canvas><script>const canvas = document.getElementById('canvas');const ctx = canvas.getContext('2d');// 1. 繪制原始圖形ctx.fillStyle = 'red';ctx.fillRect(0, 0, 200, 200);// 2. 獲取像素數據并反色const imageData = ctx.getImageData(0, 0, 200, 200);const data = imageData.data;for (let i = 0; i < data.length; i += 4) {data[i] = 255 - data[i];     // Rdata[i + 1] = 255 - data[i + 1]; // Gdata[i + 2] = 255 - data[i + 2]; // B}// 3. 寫回修改后的像素ctx.putImageData(imageData, 0, 0);</script>
</body>
</html>

7. Streams API

作用:分塊處理大型數據流,避免內存溢出。
優勢:高效處理大文件,實時數據傳輸。
使用場景:視頻流、大文件上傳/下載。

<!DOCTYPE html>
<html>
<body><script>// 1. 創建一個簡單的 ReadableStreamconst stream = new ReadableStream({start(controller) {controller.enqueue(new Uint8Array([72, 101, 108, 108, 111])); // "Hello"controller.close();}});// 2. 通過 Reader 讀取數據塊const reader = stream.getReader();reader.read().then(({ done, value }) => {if (!done) {console.log("流數據:", new TextDecoder().decode(value));}});</script>
</body>
</html>

8. WebAssembly

作用:運行高性能編譯型代碼(如 C/C++)。
優勢:接近原生性能,適合計算密集型任務。
使用場景:游戲、音視頻編碼、加密算法。

<!DOCTYPE html>
<html>
<body><script>// 假設存在 add.wasm 文件,導出一個加法函數fetch('add.wasm').then(response => response.arrayBuffer()).then(buffer => WebAssembly.instantiate(buffer)).then(({ instance }) => {console.log("WASM 加法結果:", instance.exports.add(2, 3));});</script>
</body>
</html>

常用的二進制數據轉換函數

1. 將?File?對象轉換為?Blob?對象

/*** 將 File 對象轉換為 Blob 對象(File 繼承自 Blob,可直接切片)* @param {File} file - 用戶上傳的 File 對象* @returns {Blob} - 轉換后的 Blob 對象*/
function fileToBlob(file) {// File 本身是 Blob 的子類,直接使用 slice 方法切割完整文件return file.slice(0, file.size, file.type);
}// 示例用法
const fileInput = document.querySelector('input[type="file"]');
fileInput.addEventListener('change', (e) => {const file = e.target.files[0];const blob = fileToBlob(file);console.log('File -> Blob:', blob);
});

2. 將?Blob?對象轉換為?File?對象

/*** 將 Blob 轉換為 File 對象(添加文件名和類型)* @param {Blob} blob - 需要轉換的 Blob 對象* @param {string} fileName - 文件名(含擴展名,如 "image.jpg")* @param {string} [fileType] - 文件類型(如 "image/jpeg",默認使用 Blob 的 type)* @returns {File} - 轉換后的 File 對象*/
function blobToFile(blob, fileName, fileType) {// 保留原始 Blob 的類型(若未指定 fileType)const type = fileType || blob.type;// 使用 File 構造函數創建對象(兼容性良好)return new File([blob], fileName, { type });
}// 示例用法
const blob = new Blob(['Hello, World!'], { type: 'text/plain' });
const file = blobToFile(blob, 'example.txt');
console.log('Blob -> File:', file);

3. 將?Blob?轉換為?ArrayBuffer

/*** 異步將 Blob 轉換為 ArrayBuffer* @param {Blob} blob - 需要轉換的 Blob 對象* @returns {Promise<ArrayBuffer>} - 返回 Promise 包含 ArrayBuffer*/
function blobToArrayBuffer(blob) {return new Promise((resolve, reject) => {// 使用 FileReader 讀取 Blobconst reader = new FileReader();reader.onload = () => resolve(reader.result); // 讀取完成返回 ArrayBufferreader.onerror = () => reject(reader.error);  // 處理錯誤reader.readAsArrayBuffer(blob); // 關鍵 API 調用});
}// 示例用法
const blob = new Blob(['Hello']);
blobToArrayBuffer(blob).then(buffer => {console.log('Blob -> ArrayBuffer:', buffer);
});

4. 將?ArrayBuffer?轉換為?Blob

/*** 將 ArrayBuffer 轉換為 Blob 對象* @param {ArrayBuffer} buffer - 需要轉換的 ArrayBuffer* @param {string} [type] - Blob 的 MIME 類型(如 "image/png")* @returns {Blob} - 轉換后的 Blob*/
function arrayBufferToBlob(buffer, type) {// 直接通過 Blob 構造函數轉換return new Blob([buffer], { type: type || '' });
}// 示例用法
const buffer = new Uint8Array([72, 101, 108, 108, 111]).buffer;
const blob = arrayBufferToBlob(buffer, 'text/plain');
console.log('ArrayBuffer -> Blob:', blob);

5. 將?Blob?轉換為?Base64?字符串

/*** 異步將 Blob 轉換為 Base64 字符串* @param {Blob} blob - 需要轉換的 Blob* @returns {Promise<string>} - 返回 Promise 包含 Base64 字符串*/
function blobToBase64(blob) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = () => {// 去除 DataURL 前綴(如 "data:text/plain;base64,")const base64 = reader.result.split(',')[1];resolve(base64);};reader.onerror = () => reject(reader.error);reader.readAsDataURL(blob); // 讀取為 DataURL});
}// 示例用法
const blob = new Blob(['Hello']);
blobToBase64(blob).then(base64 => {console.log('Blob -> Base64:', base64); // 輸出 "SGVsbG8="
});

6. 將?Base64?字符串轉換為?Blob

/*** 將 Base64 字符串轉換為 Blob 對象* @param {string} base64 - Base64 字符串* @param {string} [type] - Blob 的 MIME 類型(如 "image/png")* @returns {Blob} - 轉換后的 Blob*/
function base64ToBlob(base64, type) {// 將 Base64 轉換為二進制字符串const byteString = atob(base64);// 創建 Uint8Array 視圖const buffer = new Uint8Array(byteString.length);for (let i = 0; i < byteString.length; i++) {buffer[i] = byteString.charCodeAt(i);}// 生成 Blobreturn new Blob([buffer], { type: type || '' });
}// 示例用法
const base64 = 'SGVsbG8='; // "Hello" 的 Base64
const blob = base64ToBlob(base64, 'text/plain');
console.log('Base64 -> Blob:', blob);

7. 將?Blob?轉換為?DataURL

/*** 異步將 Blob 轉換為 DataURL(可直接用于 img.src)* @param {Blob} blob - 需要轉換的 Blob* @returns {Promise<string>} - 返回 Promise 包含 DataURL*/
function blobToDataURL(blob) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = () => resolve(reader.result); // 直接返回完整 DataURLreader.onerror = () => reject(reader.error);reader.readAsDataURL(blob);});
}// 示例用法(圖片預覽)
const blob = new Blob([new Uint8Array([0x89, 0x50, 0x4E, 0x47])], { type: 'image/png' });
blobToDataURL(blob).then(dataURL => {console.log('Blob -> DataURL:', dataURL); // 輸出 "data:image/png;base64,..."
});

8. 將?Blob?轉換為?Object URL

/*** 將 Blob 轉換為 Object URL(需手動釋放內存)* @param {Blob} blob - 需要轉換的 Blob* @returns {string} - Object URL(如 "blob:http://...")*/
function blobToObjectURL(blob) {// 使用 URL.createObjectURL 生成臨時鏈接return URL.createObjectURL(blob);
}// 示例用法
const blob = new Blob(['Hello']);
const url = blobToObjectURL(blob);
console.log('Blob -> Object URL:', url);// 使用后需釋放內存!
// URL.revokeObjectURL(url);

9. 將?Blob?轉換為?Uint8Array

/*** 異步將 Blob 轉換為 Uint8Array* @param {Blob} blob - 需要轉換的 Blob* @returns {Promise<Uint8Array>} - 返回 Promise 包含 Uint8Array*/
function blobToUint8Array(blob) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = () => {// 通過 ArrayBuffer 創建 Uint8Arrayconst buffer = reader.result;resolve(new Uint8Array(buffer));};reader.onerror = () => reject(reader.error);reader.readAsArrayBuffer(blob);});
}// 示例用法
const blob = new Blob(['Hello']);
blobToUint8Array(blob).then(uint8Array => {console.log('Blob -> Uint8Array:', uint8Array); // 輸出 [72, 101, 108, 108, 111]
});

10. 將?Blob?轉換為文本

/*** 異步將 Blob 轉換為文本內容* @param {Blob} blob - 需要轉換的 Blob* @param {string} [encoding] - 文本編碼(默認 "utf-8")* @returns {Promise<string>} - 返回 Promise 包含文本內容*/
function blobToText(blob, encoding = 'utf-8') {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = () => resolve(reader.result);reader.onerror = () => reject(reader.error);reader.readAsText(blob, encoding); // 指定編碼讀取});
}// 示例用法
const blob = new Blob(['你好']);
blobToText(blob).then(text => {console.log('Blob -> Text:', text); // 輸出 "你好"
});

11.使用總結

  • 通用邏輯:大部分轉換依賴?FileReader?和?Blob?構造函數。

  • 關鍵點

    • FileReader?的?readAsXXX?方法決定讀取格式。

    • Blob?的?type?屬性影響生成文件的 MIME 類型。

    • Object URL?使用后需調用?URL.revokeObjectURL()?釋放內存。

  • 錯誤處理:所有異步函數均返回 Promise,建議用?try/catch?包裹。

完整的圖片上傳案例

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>圖片上傳與居中全屏預覽</title><style>/* 基礎樣式重置 */* {margin: 0;padding: 0;box-sizing: border-box;}/* 頁面主體樣式 */body {font-family: Arial, sans-serif;min-height: 100vh;background: #f5f5f5;display: flex;flex-direction: column;align-items: center;padding: 20px;}/* 上傳容器樣式 */.upload-container {background: white;padding: 30px;border-radius: 10px;box-shadow: 0 2px 10px rgba(0,0,0,0.1);margin-bottom: 20px;text-align: center;}/* 自定義上傳按鈕 */.custom-upload-btn {background: #2196F3;color: white;padding: 12px 24px;border-radius: 5px;cursor: pointer;transition: background 0.3s;display: inline-block;}.custom-upload-btn:hover {background: #1976D2;}/* 隱藏原生文件輸入 */#fileInput {display: none;}/* 錯誤提示樣式 */.error-message {color: #ff4444;margin-top: 10px;display: none;}/* 預覽容器樣式 */#previewContainer {max-width: 90%;margin: 20px 0;cursor: zoom-in;position: relative;display: none; /* 默認隱藏 */}/* 預覽圖片樣式 */#previewImage {max-width: 100%;max-height: 70vh;border-radius: 8px;box-shadow: 0 4px 12px rgba(0,0,0,0.15);transition: transform 0.3s;}/* 全屏模式樣式 */#previewContainer.fullscreen {position: fixed;top: 0;left: 0;width: 100vw;height: 100vh;background: rgba(0, 0, 0, 0.9);z-index: 9999;cursor: zoom-out;display: flex !important; /* 強制覆蓋默認樣式 */align-items: center; /* 垂直居中 */justify-content: center; /* 水平居中 */}/* 全屏時圖片樣式 */#previewContainer.fullscreen #previewImage {max-width: 90vw;max-height: 90vh;object-fit: contain; /* 保持比例填充 */}</style>
</head>
<body>
<!-- 上傳區域 -->
<div class="upload-container"><label class="custom-upload-btn" for="fileInput">📷 點擊上傳圖片</label><input type="file" id="fileInput" accept="image/*"><div class="error-message" id="errorMessage">只能上傳圖片文件 (JPEG/PNG/GIF)</div>
</div><!-- 圖片預覽區域 -->
<div id="previewContainer"><img id="previewImage" alt="圖片預覽">
</div><script>// =====================// 元素獲取// =====================const fileInput = document.getElementById('fileInput');const previewImage = document.getElementById('previewImage');const previewContainer = document.getElementById('previewContainer');const errorMessage = document.getElementById('errorMessage');// =====================// 文件上傳處理// =====================fileInput.addEventListener('change', function(e) {const file = e.target.files[0];// 清除錯誤提示errorMessage.style.display = 'none';if (!file) return;// 驗證文件類型if (!file.type.startsWith('image/')) {showError("文件類型錯誤,請選擇圖片");this.value = ''; // 清空選擇return;}// 創建文件閱讀器const reader = new FileReader();// 文件讀取成功回調reader.onload = function(e) {previewImage.src = e.target.result;previewContainer.style.display = 'block'; // 顯示預覽容器};// 錯誤處理reader.onerror = function() {showError("文件讀取失敗");previewContainer.style.display = 'none';};// 開始讀取文件reader.readAsDataURL(file);});// =====================// 全屏功能// =====================previewContainer.addEventListener('click', toggleFullscreen);// 全屏切換函數function toggleFullscreen() {if (document.fullscreenElement) {exitFullscreen();} else {enterFullscreen(previewContainer);}}// 進入全屏function enterFullscreen(element) {if (element.requestFullscreen) {element.requestFullscreen();} else if (element.mozRequestFullScreen) { // Firefoxelement.mozRequestFullScreen();} else if (element.webkitRequestFullscreen) { // Chrome/Safarielement.webkitRequestFullscreen();} else if (element.msRequestFullscreen) { // IE/Edgeelement.msRequestFullscreen();}// 添加全屏類名element.classList.add('fullscreen');}// 退出全屏function exitFullscreen() {if (document.exitFullscreen) {document.exitFullscreen();} else if (document.mozCancelFullScreen) { // Firefoxdocument.mozCancelFullScreen();} else if (document.webkitExitFullscreen) { // Chrome/Safaridocument.webkitExitFullscreen();} else if (document.msExitFullscreen) { // IE/Edgedocument.msExitFullscreen();}// 移除全屏類名previewContainer.classList.remove('fullscreen');}// 監聽全屏狀態變化document.addEventListener('fullscreenchange', () => {previewContainer.classList.toggle('fullscreen', !!document.fullscreenElement);});// =====================// 輔助函數// =====================function showError(message) {errorMessage.textContent = message;errorMessage.style.display = 'block';previewContainer.style.display = 'none';}
</script>
</body>
</html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80495.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80495.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80495.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cacti 未經身份驗證SQL注入漏洞

0x00 前言 Cacti是一套基于PHP,MySQL,SNMP及RRDTool開發的網絡流量監測圖形分析工具。 Cacti是通過 snmpget來獲取數據&#xff0c;使用 RRDtool繪畫圖形&#xff0c;而且你完全可以不需要了解RRDtool復雜的參數。 0x01 漏洞描述 漏洞存在于從graph_view.php文件調用的growt…

使用國內源加速Qt在線安裝

簡介&#xff1a; 在線安裝Qt時&#xff0c;會發現下載非常緩慢&#xff0c;可以用過使用國內鏡像源來加速安裝過程。 在線安裝包的下載過程&#xff1a; 1&#xff0c;打開下載頁面 https://www.qt.io/download-open-source 2&#xff0c;點擊 Download the Qt online ins…

C#上位機RS485通信控制變頻器

C#上位機使用Modbus RTU協議控制變頻器 一、RTU報文格式示例 通信命令碼&#xff1a; 03H:讀從機參數 06H:寫從機參數 10H:寫多個參數上位機寫單個寄存器&#xff1a;【從機地址】1字節【命令碼】1字節【寄存器地址高-低】2字節【數據值高-低】2字節【CRC校驗值低-高】…

OCC筆記:Brep格式

1. BREP格式簡介 BREP格式是Open CASCADE內核&#xff08;OCCT&#xff09;的原生數據模型&#xff0c;直接描述幾何體的邊界表示&#xff08;面、邊、頂點拓撲關系及幾何參數&#xff09;。于OCCT內核的算法計算&#xff08;如布爾運算、曲面細分&#xff09;&#xff0c;存儲…

Vue3進行工程化項目,保姆級教學(編譯軟件:vscode)大部分編譯平臺適用

目錄 1. 創建vue工程 1.1 第一步 1.2 選擇名稱和工件 1.3 選擇語言 1.4 自動下載js 1.5 運行vue工程 1.6 成功頁面 2. 更改vue工程安裝的位置 3. 更改運行工程方式 第一步 第二步 ?編輯 第三步 調試 ?編輯 運行項目 前面所學都是vue3的基礎&#xff0c;為了簡…

CSS常用選擇器

CSS選擇器用于選擇HTML元素并為其應用樣式。以下是CSS中最常用的選擇器類型&#xff1a; 基本選擇器 1.元素選擇器 - 通過HTML標簽名選擇元素 p { color: blue; } 2.類選擇器 - 通過class屬性選擇元素&#xff08;以.開頭&#xff09; .warning { color: red; } 3.ID選擇…

EmberGen導出序列圖到UE5

選擇Render節點 調整節點相關參數 然后選擇一個目錄 點擊導出Export Now即可 材質用FlipBook 如果是特效就SubUV

EXCEL Python 實現繪制柱狀線型組合圖和樹狀圖(包含數據透視表)

1、組合圖、數據透視表 &#xff08;1&#xff09;數據預處理 知識點 日期函數 year() month()數據透視表操作 同比計算公式 環比計算公式 &#xff08;2&#xff09;excel 數據透視表插入組合圖 a.2015~2017數據集處理方式&#xff1a; 操作&#xff1a; 結果 b.2020~20…

LabVIEW光譜檢測系統

腔衰蕩光譜技術&#xff08;CRDS&#xff09;憑借高精度和高靈敏度特性&#xff0c;成為微量氣體濃度檢測的常用方法&#xff0c;而準確獲取衰蕩時間是該技術應用的關鍵。基于LabVIEW平臺設計腔衰蕩信號在線處理系統&#xff0c;實現對衰蕩信號的實時采集、平均、擬合、顯示和保…

Flask快速入門和問答項目源碼

Flask基礎入門 源碼&#xff1a; gitee&#xff1a;我愛白米飯/Flask問答項目 - 碼云 目錄 1.安裝環境2.【debug、host、port】3.【路由params和query】4.【模板】5.【靜態文件】6.【數據庫連接】6.1.安裝模塊6.2.創建數據庫并測試連接6.3.創建數據表6.4.ORM增刪改查 6.5.ORM模…

flutter長列表 ListView、GridView、SingleChildScrollView、CustomScrollView區別

組件名稱用途/適合場景是否懶加載支持列表結構用法復雜度SingleChildScrollView適用于內容數量不大、不重復的頁面&#xff08;如表單、靜態內容&#xff09;? 否? 否??ListView適用于垂直方向的長列表&#xff0c;自動滾動&#xff1b;適合展示大量數據? 支持? 是??Li…

鴻蒙OSUniApp 開發的一鍵分享功能#三方框架 #Uniapp

使用 UniApp 開發的一鍵分享功能 在移動應用開發中&#xff0c;分享功能幾乎是必不可少的一環。一個好的分享體驗不僅能帶來更多用戶&#xff0c;還能提升產品的曝光度。本文將詳細講解如何在 UniApp 框架下實現一個簡單高效的一鍵分享功能&#xff0c;適配多個平臺。 各平臺分…

Vue-監聽屬性

監聽屬性 簡單監聽 點擊切換名字&#xff0c;來回變更Tom/Jerry&#xff0c;輸出 你好&#xff0c;Tom/Jerry 代碼 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>監聽屬性</title><!-- …

DeepSeek 賦能物聯網:從連接到智能的跨越之路

目錄 一、引言&#xff1a;物聯網新時代的開啟二、DeepSeek 技術揭秘2.1 DeepSeek 是什么2.2 DeepSeek 技術優勢 三、DeepSeek 與物聯網的融合之基3.1 物聯網發展現狀與挑戰3.2 DeepSeek 帶來的變革性突破 四、DeepSeek 在物聯網的多元應用場景4.1 智慧電力&#xff1a;開啟能源…

3.6/Q1,GBD數據庫最新文章解讀

文章題目&#xff1a;Global, regional, and national burden of geriatric depressive disorders in people aged 60 years and older: an analysis of the Global Burden of Disease Study 2021 DOI&#xff1a;10.1186/s12991-025-00560-2 中文標題&#xff1a;60 歲及以上人…

LVGL學習筆記

文章目錄 一、 LVGL移植教程(GD32)一 并行驅動 LED二三一、 LVGL移植教程(GD32) 參考鏈接 1.GD32+LVGL移植教程(超詳細)——基于GD32F303X系列MCU 一 并行驅動 LED 根據您提供的引腳信號(DCLK、DISP、HSYNC、VSYNC、DE),可以判斷這是一款采用 TTL/Parallel RGB 接口…

軟件架構之--論微服務的開發方法1

論微服務的開發方法1 摘要 2023年 2月,本人所在集團公司承接了長三角地區某省漁船圖紙電子化審查系統項目開發,該項目旨在為長三角地區漁船建造設計院、以及漁船圖紙審查機構提供一個便捷的漁船圖紙電子化審查服務平臺。在此項目中,我作為項目組成員參與項目的建設工作,并…

如何在終端/命令行中把PDF的每一頁轉換成圖片(PNG)

今天被對象安排了一個任務&#xff1a; 之前自己其實也有這個需要&#xff0c;但是吧&#xff0c;我懶&#xff1a;量少拖拽&#xff0c;量大就放棄。但這次躲不過去了&#xff0c;所以研究了一下有什么工具可以做到這個需求。 本文記錄我這次發現的使用 XpdfReader 的方法。…

mac安裝cast

背景 pycharm本地運行腳本時提示cast沒有安裝 問題原因 腳本嘗試調用cast命令&#xff08;以太坊開發工具foundry中的子命令&#xff09;&#xff0c;但您的系統未安裝該工具。 從日志可見&#xff0c;錯誤發生在通過sysutil.py執行shell命令時。 解決方案 方法1&#xf…

【搭建Node-RED + MQTT Broker實現AI大模型交互】

搭建Node-RED MQTT Broker實現AI大模型交互 搭建Node-RED MQTT Broker實現AI大模型交互一、系統架構二、環境準備與安裝1. 安裝Node.js2. 安裝Mosquitto MQTT Broker3. 配置Mosquitto4. 安裝Node-RED5. 配置Node-RED監聽所有網絡接口6. 啟動Node-RED 三、Node-RED流程配置1. …