Electron使用WebAssembly實現CRC-32 常用標準校驗

Electron使用WebAssembly實現CRC-32 常用標準校驗

將C/C++語言代碼,經由WebAssembly編譯為庫函數,可以在JS語言環境進行調用。這里介紹在Electron工具環境使用WebAssembly調用CRC-32 常用標準格式校驗的方式。

CRC-32 常用標準校驗函數WebAssembly源文件

C語言實現CRC-32 常用標準格式校驗的介紹見:《C語言標準CRC-32校驗函數》

選擇上面介紹文章中的uint32_t PY_CRC_32_M(uint8_t *di, uint32_t len)校驗函數,建立一個新文件PY_CRC_32_M.cc:

#ifndef EM_PORT_API
#	if defined(__EMSCRIPTEN__)
#		include <emscripten.h>
#		if defined(__cplusplus)
#			define EM_PORT_API(rettype) extern "C" rettype EMSCRIPTEN_KEEPALIVE
#		else
#			define EM_PORT_API(rettype) rettype EMSCRIPTEN_KEEPALIVE
#		endif
#	else
#		if defined(__cplusplus)
#			define EM_PORT_API(rettype) extern "C" rettype
#		else
#			define EM_PORT_API(rettype) rettype
#		endif
#	endif
#endif#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>EM_PORT_API(void *) mymalloc(uint32_t size) {return malloc(size);
}EM_PORT_API(void) myfree(void * ptr) {free(ptr);
}EM_PORT_API(uint32_t) PY_CRC_32_M(uint8_t *di, uint32_t len)
{uint32_t crc_poly = 0xEDB88320;  //Inversion bit sequence of 0x04C11DB7uint32_t data_t = 0xFFFFFFFF; //initial valuefor(uint32_t i=0; i<len; i++){data_t ^=  di[i];for (int8_t j = 8; j > 0; --j){data_t = (data_t >> 1) ^ ((data_t & 1)? crc_poly: 0);}}return data_t ^ 0xFFFFFFFF;
}

這個文件有三個函數導出,前兩個是獲取和釋放內存的函數,后一個就是CRC-32 常用標準校驗函數的導出。

將這個文件進行WebAssembly編譯,就會得到兩個庫文件:
在這里插入圖片描述

將這幾個文件拷貝到后面建立的Electron工程目錄,再進行調用。

Electron調用WebAssembly CRC-32 常用標準函數演示源文件

下載Electron的Hello World!例程,并實現正常運行:
在這里插入圖片描述

然后將前面的3個WebAssembly相關文件,放到例程根目錄。再引入一個jQuery庫。編寫index.html文件如下:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP --><link href="./styles.css" rel="stylesheet"><title>Hello World!</title><script>window.$ = window.jQuery = require('./js/jquery-3.3.1.min.js');</script></head><script src="PY_CRC_32_M.js"></script><script src="./mainprocess.js"></script>  <body><h1>Hello World!</h1>We are using Node.js <span id="node-version"></span>,Chromium <span id="chrome-version"></span>,and Electron <span id="electron-version"></span>.<!-- You can also require other files to run in this process --><script src="./renderer.js"></script></body>
</html>

主要修改部分為引入了jQuery,引入了PY_CRC_32_M.js以及引入了mainprocess.js,mainprocess.js是在例程根目錄下新建的工程文件,內容如下:

// This file is required by the index.html file and will
// be executed in the renderer process for that window.
// All of the Node.js APIs are available in this process.//增加當前運行狀態和當前運行進程/函數信息,控制不產生誤觸發
window.name="mainwindow";   $(document).ready(function(){Module.onRuntimeInitialized = function() {console.log(Module);}setTimeout(function(){var count = 8;var ptr = Module._mymalloc(count);for (var i = 0; i < count; i++){Module.HEAP8[ptr + i] = 1+i;}console.log(Module._PY_CRC_32_M(ptr, count));Module._myfree(ptr);},2000);   //Delay is a must for Module initialized! });process.on('uncaughtException', function (){});

mainprocess.js實現了WebAssembly庫文件的導入和使用,Module._mymalloc用于申請內存空間,Module._myfree用于釋放內存空間,Module.HEAP8[ptr + i] = 1+i;用于給申請到的內存空間從1開始賦值,這里堆空間為8個字節,因此賦值從1到8。Module._PY_CRC_32_M(ptr, count)則進行CRC-32 常用標準校驗函數的調用,提供了內存指針和要校驗的字節數量。

整個Electron工程環境的文件如下所示:
在這里插入圖片描述

Electron調用WebAssembly CRC-32 常用標準函數演示效果

通過在控制臺輸入 npm start執行Electron工程,打開console顯示:
在這里插入圖片描述

1070237893是打印出的CRC校驗結果,十六進制值為0x3FCA88C5 ,通過在線工具比較驗證:

在這里插入圖片描述

Electron使用WebAssembly實現CRC-32 常用標準校驗演示工程下載

Electron Demo工程下載,包含已編譯后的WebAssembly庫文件:
在這里插入圖片描述

–End–

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

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

相關文章

Docker基礎篇——Ubuntu下Docker安裝

大家好我是木木&#xff0c;在當今快速發展的云計算與云原生時代&#xff0c;容器化技術蓬勃興起&#xff0c;Docker 作為實現容器化的主流工具之一&#xff0c;為開發者和運維人員帶來了極大的便捷 。下面我們一起進行Docker安裝。 Docker的官方Ubuntu安裝文檔&#xff0c;如…

第五課:Express框架與RESTful API設計:技術實踐與探索

在使用Node.js進行企業應用開發&#xff0c;常用的開發框架Express&#xff0c;其中的中間件、路由配置與參數解析、RESTful API核心技術尤為重要&#xff0c;本文將深入探討它們在應用開發中的具體使用方法&#xff0c;最后通過Postman來對開發的接口進行測試。 一、Express中…

mitmproxy配合Wireshark 抓包分析

Mitmproxy 是一款非常強大的 交互式 HTTP 代理 工具&#xff0c;它被廣泛應用于 Web 開發、API 調試、安全測試 等領域。與 Wireshark 側重于被動監聽網絡流量不同&#xff0c;Mitmproxy 更像一個 主動的中間人&#xff0c;可以攔截、檢查、修改和重放 HTTP/HTTPS 流量&#xf…

Varlens(手機上的單反)Ver.1.9.3 高級版.apk

Varlens 是一款專業級手機攝影軟件&#xff0c;旨在通過豐富的功能和高自由度參數調節&#xff0c;讓手機拍攝效果媲美微單相機。以下是核心功能總結&#xff1a; 一、核心功能 專業拍攝模式 支持手動/自動/程序模式&#xff0c;可調節ISO、快門速度、EV、白平衡等參數27 提供…

Scala 中的訪問修飾符

在Scala中&#xff0c;面向對象的權限控制主要通過訪問修飾符來實現。Scala提供了以下幾種訪問修飾符來控制類、對象、成員變量和方法的訪問權限&#xff1a; 1. 默認訪問權限&#xff08;無修飾符&#xff09; 如果沒有指定任何訪問修飾符&#xff0c;成員默認是public的&…

第十五屆藍橋杯省賽電子類單片機學習過程記錄(客觀題)

客觀試題: 01.典型的BUCK電源電路包含哪些關鍵器件(ABCD) A. 電容 B. 二極管 C. 電感 D. MOSFET 解析: 典型的 BUCK 電源電路是一種降壓型的直流-直流轉換電路,它包含以下關鍵器件: A.電容:電容在電路中起到濾波的作用。輸入電容用于平滑輸入電壓的波動,減少電源噪聲對…

Dify使用日常:我是如何按標題級別將word中的內容轉存到excel中的

先上效果圖 word中的內容 轉存到excel之后 實現步驟&#xff1a; 1、在dify中創建一個工作流&#xff0c;如上圖 2、在開始節點增加一個支持文件上傳的變量 3、添加文檔提取器&#xff0c;提取上傳的文件中的內容 4、添加大模型節點&#xff0c;將文檔提取器提取出來的內容&…

Vue 框架深度解析:源碼分析與實現原理詳解

文章目錄 一、Vue 核心架構設計1.1 整體架構流程圖1.2 模塊職責劃分 二、響應式系統源碼解析2.1 核心類關系圖2.2 核心源碼分析2.2.1 數據劫持實現2.2.2 依賴收集過程 三、虛擬DOM與Diff算法實現3.1 Diff算法流程圖3.2 核心Diff源碼 四、模板編譯全流程剖析4.1 編譯流程圖4.2 編…

IDEA與Maven使用-學習記錄(持續補充...)

1. 下載與安裝 以ideaIU-2021.3.1為例&#xff0c;安裝步驟&#xff1a; 以管理員身份啟動ideaIU-2021.3.1修改安裝路徑為&#xff1a;D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾選【創建桌面快捷方式】&#xff08;可選&#xff09;、【打開文件夾作為項目】&…

認識vue2腳手架

1.認識腳手架結構 使用VSCode將vue項目打開&#xff1a; package.json&#xff1a;包的說明書&#xff08;包的名字&#xff0c;包的版本&#xff0c;依賴哪些庫&#xff09;。該文件里有webpack的短命令&#xff1a; serve&#xff08;啟動內置服務器&#xff09; build命令…

SQL經典查詢

查詢不在表里的數據&#xff0c;一張學生表&#xff0c;一張學生的選課表&#xff0c;要求查出沒有選課的學生&#xff1f; select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…

《機器學習數學基礎》補充資料:過渡矩陣和坐標變換推導

盡管《機器學習數學基礎》這本書&#xff0c;耗費了比較長的時間和精力&#xff0c;怎奈學識有限&#xff0c;錯誤難免。因此&#xff0c;除了在專門的網頁&#xff08; 勘誤和修訂 &#xff09;中發布勘誤和修訂內容之外&#xff0c;對于重大錯誤&#xff0c;我還會以專題的形…

解鎖DeepSpeek-R1大模型微調:從訓練到部署,打造定制化AI會話系統

目錄 1. 前言 2.大模型微調概念簡述 2.1. 按學習范式分類 2.2. 按參數更新范圍分類 2.3. 大模型微調框架簡介 3. DeepSpeek R1大模型微調實戰 3.1.LLaMA-Factory基礎環境安裝 3.1大模型下載 3.2. 大模型訓練 3.3. 大模型部署 3.4. 微調大模型融合基于SpirngBootVue2…

第七課:Python反爬攻防戰:Headers/IP代理與驗證碼

在爬蟲開發過程中&#xff0c;反爬蟲機制成為了我們必須面對的挑戰。本文將深入探討Python爬蟲中常見的反爬機制&#xff0c;并詳細解析如何通過隨機User-Agent生成、代理IP池搭建以及驗證碼識別來應對這些反爬策略。文章將包含完整的示例代碼&#xff0c;幫助讀者更好地理解和…

Vue3——Fragment

文章目錄 一、Fragment的核心意義1. 解決Vue2的單根限制問題2. 減少不必要的 DOM 嵌套3. 語義化和結構化 二、Fragment 的實現原理三、Fragment 使用方式1. 基本用法2. 結合條件渲染3. 動態組件 四、實際應用場景1. 列表/表格組件2. 布局組件3. 語義化標簽 五、注意事項1. 屬性…

字節跳動C++客戶端開發實習生內推-抖音基礎技術

智能手機愛好者和使用者&#xff0c;追求良好的用戶體驗&#xff1b; 具有良好的編程習慣&#xff0c;代碼結構清晰&#xff0c;命名規范&#xff1b; 熟練掌握數據結構與算法、計算機網絡、操作系統、編譯原理等課程&#xff1b; 熟練掌握C/C/OC/Swift一種或多種語言&#xff…

【Linux學習筆記】Linux基本指令分析和權限的概念

【Linux學習筆記】Linux基本指令分析和權限的概念 &#x1f525;個人主頁&#xff1a;大白的編程日記 &#x1f525;專欄&#xff1a;Linux學習筆記 文章目錄 【Linux學習筆記】Linux基本指令分析和權限的概念前言一. 指令的分析1.1 alias 指令1.2 grep 指令1.3 zip/unzip 指…

數據庫索引的作用:提升數據檢索效率的關鍵

在數據庫管理系統中&#xff0c;數據如同浩瀚海洋中的寶藏&#xff0c;如何快速準確地找到所需信息&#xff0c;成為了一個關鍵問題。這時候&#xff0c;數據庫索引就如同一張精確的航海圖&#xff0c;指引著我們高效地定位數據。那么&#xff0c;數據庫索引究竟是什么&#xf…

Lab18_ SQL injection with filter bypass via XML encoding

文章目錄 前言&#xff1a;進入實驗室構造 payload 前言&#xff1a; 實驗室標題為&#xff1a; 通關 XML 編碼繞過過濾器的 SQL 注入 簡介&#xff1a; 此實驗室的庫存檢查功能中存在 SQL 注入漏洞。查詢結果在應用程序的響應中返回&#xff0c;因此您可以使用 UNION 攻擊…

計算機性能指標(計網筆記)

計算機性能指標&#xff1a;速率、帶寬、吞吐率、時延、時延帶寬積、往返時間RTT、利用率 速率 數據的傳輸速率&#xff0c;單位bit/s&#xff0c;或kbit/s&#xff0c;Mbit/s&#xff0c;Gbit/s 4*10**10bit/s40Gbit/s 常用帶寬單位&#xff1a; 千比每秒kb/s 兆比每秒Mb/s…