Electron使用WebAssembly實現CRC-16 MAXIM校驗

Electron使用WebAssembly實現CRC-16 MAXIM校驗

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

CRC-16 MAXIM校驗函數WebAssembly源文件

C語言實現CRC-16 MAXIM格式校驗的介紹見:《C語言CRC-16 MAXIM格式校驗函數》

選擇上面介紹文章中的uint16_t PY_CRC_16_T8_MAXIM_i(uint8_t *di, uint32_t len)校驗函數,建立一個新文件PY_CRC_16_T8_MAXIM_i.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>EM_PORT_API(void *) mymalloc(uint32_t size) {return malloc(size);
}EM_PORT_API(void) myfree(void * ptr) {free(ptr);
}EM_PORT_API(uint16_t) PY_CRC_16_T8_MAXIM_i(uint8_t *di, uint32_t len)
{uint16_t crc_poly = 0xA001; //Bit sequence inversion of 0x8005uint16_t data_t = 0; //CRC registerfor(uint32_t i = 0; i < len; i++){data_t ^= di[i]; //8-bit datafor (uint8_t j = 0; j < 8; j++){if (data_t & 0x0001)data_t = (data_t >> 1) ^ crc_poly;elsedata_t >>= 1;}}return data_t ^ 0xFFFF;
}

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

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

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

Electron調用WebAssembly CRC-16 MAXIM函數演示源文件

下載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_16_T8_MAXIM_i.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_16_T8_MAXIM_i.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_16_T8_MAXIM_i(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_16_T8_MAXIM_i(ptr, count)則進行CRC-16 MAXIM校驗函數的調用,提供了內存指針和要校驗的字節數量。

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

Electron調用WebAssembly CRC-16 MAXIM函數演示效果

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

15119是打印出的CRC校驗結果,十六進制值為0x3B0F, 通過在線工具比較驗證:
在這里插入圖片描述

Electron使用WebAssembly實現CRC-16 MAXIM校驗演示工程下載

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

–End–

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

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

相關文章

vue3vue-elementPlus-admin框架中form組件的upload寫法

dialog中write組件代碼 let ImageList reactive<UploadFile[]>([])const formSchema reactive<FormSchema[]>([{field: ImageFiles,label: 現場圖片,component: Upload,colProps: { span: 24 },componentProps: {limit: 5,action: PATH_URL /upload,headers: {…

Linux mount和SSD分區

為什么要用 mount&#xff1f; Linux 的文件系統結構是單一的樹狀層次 所有文件、目錄和設備都從根目錄 / 開始延伸。 外部的存儲設備&#xff08;如硬盤、U盤、網絡存儲&#xff09;或虛擬文件系統&#xff08;如 /proc、/sys&#xff09;必須通過掛載點“嫁接”到這棵樹上&a…

【Function】Azure Function通過托管身份或訪問令牌連接Azure SQL數據庫

【Function】Azure Function通過托管身份或訪問令牌連接Azure SQL數據庫 推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 【Function】Azure Function通過托管身份或訪問令牌連接Azu…

舉例說明 牛頓法 Hessian 矩陣

矩陣求逆的方法及示例 目錄 矩陣求逆的方法及示例1. 伴隨矩陣法2. 初等行變換法矩陣逆的實際意義1. 求解線性方程組2. 線性變換的逆操作3. 數據分析和機器學習4. 優化問題牛頓法原理解釋舉例說明 牛頓法 Hessian 矩陣1. 伴隨矩陣法 原理:對于一個 n n n 階方陣 A A

安科瑞分布式光伏監測系統:推動綠色能源高效發展

安科瑞顧強 為應對傳統能源污染與資源短缺&#xff0c;分布式光伏發電成為關鍵解決方案。安科瑞Acrel-1000DP分布式光伏監控系統結合光功率預測技術&#xff0c;有效提升發電穩定性&#xff0c;助力上海汽車變速器有限公司8.3MW屋頂光伏項目實現清潔能源高效利用。 項目亮點 …

從零開始使用 **Taki + Node.js** 實現動態網頁轉靜態網站的完整代碼方案

以下是從零開始使用 Taki Node.js 實現動態網頁轉靜態網站的完整代碼方案&#xff0c;包含預渲染、自動化構建、靜態托管及優化功能&#xff1a; 一、環境準備 1. 初始化項目 mkdir static-site && cd static-site npm init -y2. 安裝依賴 npm install taki expre…

商業智能BI分析中,汽車4S銷售行業的返廠頻次有什么分析價值?

買過車的朋友會發現&#xff0c;同一款車不管在哪個4S店去買&#xff0c;基本上價格都相差不大。即使有些差別&#xff0c;也是帶著附加條件的&#xff0c;比如要做些加裝需要額外再付一下費用。為什么汽車4S銷售行業需要商業智能BI&#xff1f;就是因為在汽車4S銷售行業&#…

靜態鏈接過程發生了什么?

在靜態鏈接過程中主要發生了兩件事。一是空間與地址分配&#xff0c;鏈接器掃描所有輸入文件的段&#xff0c;合并相似段并且重新計算段長度和在虛擬內存中的映射關系&#xff0c;收集所有的符號放到全局符號表中。二是符號解析與重定位&#xff0c;鏈接器收集所有的段信息和重…

? 一次有趣的經歷

&#x1f4c6;2025年3月17日 | 周一 | ??晴 &#x1f4cd;今天路過學院樓7&#xff0c;見到了滿園盛開的花&#x1f33a;&#xff0c;心情瞬間明朗&#xff01; &#x1f4cc;希望接下來的日子也能像這些花一樣&#xff0c;充滿活力&#x1f525;&#xff01; &#x1…

docker安裝redis

第一步&#xff1a;docker拉取redis鏡像 這種命令如果沒有指定版本則是最新版本&#xff1a;docker pull redis 成功了 docker images 查詢已經拉取成功鏡像 然后因為在容器內部我們修改redis的配置不好修改&#xff0c;所以我們可以進行掛載配置文件 這個配置文件可以方便…

C語言學習筆記(第三部份)

說明&#xff1a;由于所有內容放在一個md文件中會非常卡頓&#xff0c;本文件將接續C_1.md文件的第三部分 整型存儲和大小端 引例&#xff1a; int main(void) {// printf("%d\n", SnAdda(2, 5));// PrintDaffodilNum(10000);// PrintRhombus(3);int i 0;int arr[…

Cortical Labs公司CL1人腦芯片:開啟生物智能計算新時代

Cortical Labs公司CL1人腦芯片&#xff1a;開啟生物智能計算新時代 在科技飛速發展的今天&#xff0c;人工智能已經深入到我們生活的各個角落&#xff0c;但隨著其發展&#xff0c;也面臨著能耗高、效率有限等諸多挑戰。為了突破這些瓶頸&#xff0c;科學家們開始探索將生物學…

Python學習第十八天

Django模型 定義&#xff1a;模型是 Django 中用于定義數據庫結構的 Python 類。每個模型類對應數據庫中的一張表&#xff0c;類的屬性對應表的字段。 作用&#xff1a;通過模型&#xff0c;Django 可以將 Python 代碼與數據庫表結構關聯起來&#xff0c;開發者無需直接編寫 S…

Windows 圖形顯示驅動開發-WDDM 3.0功能- 硬件翻轉隊列(一)

WDDM 3.0 之前的翻轉隊列模型 許多新式顯示控制器支持對按順序顯示的多個幀排隊的能力。 從 WDDM 2.1 開始&#xff0c;OS 支持將在下一個 VSync 中顯示的多個未完成的翻轉覆蓋請求。 顯示微型端口驅動程序 (KMD) 通過 DXGK_DRIVERCAPS 中的 MaxQueuedMultiPlaneOverlayFlipVS…

《Python深度學習》第二講:深度學習的數學基礎

本講來聊聊深度學習的數學基礎。 深度學習聽起來很厲害,其實它背后是一些很有趣的數學原理。本講會用簡單的方式解釋這些原理,還會用一些具體的例子來幫助你理解。 2.1 初識神經網絡 先從一個簡單的任務開始:識別手寫數字。 想象一下,你有一堆手寫數字的圖片,你想讓計算…

車載DoIP測試 --- CANoe DoIP中如何配置路由激活請求中的 OEM 特定場(RoutingActivationWithOEMSpecific)

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

JDBC數據庫連接池技術詳解——從傳統連接方式到高效連接管理

1. 引言 在開發數據庫應用時&#xff0c;我們通常需要與數據庫建立連接并執行SQL語句。傳統的JDBC連接方式雖然簡單直接&#xff0c;但在高并發場景下容易帶來性能問題&#xff0c;甚至導致系統崩潰。因此&#xff0c;引入數據庫連接池&#xff08;Connection Pool&#xff09…

【工具類】PDF文件轉圖片

PDF文件轉文件 1. 引入Maven依賴 主要使用了 pdfbox 包與 hutool 包。 pdfbox 負責 pdf 到圖片的轉換&#xff1b; hutool 負責文件讀取轉換。 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version…

使用DeepSeek,優化斐波那契數函數,效果相當不錯

下面這段代碼定義了一個遞歸函數 fibonacci&#xff0c;用于計算第 n 個斐波那契數。 def fibonacci(n):if n < 1:return nelse:return fibonacci(n - 1) fibonacci(n - 2)雖然代碼邏輯正確&#xff0c;但其性能較差&#xff0c;尤其是對于較大的 n 值&#xff0c;其復雜度…

Forward Looking Radar Imaging by Truncated Singular Value Decomposition 論文閱讀

Forward Looking Radar Imaging by Truncated Singular Value Decomposition and Its Application for Adverse Weather Aircraft Landing 1. 論文的研究目標與意義1.1 研究目標1.2 實際問題與意義2. 論文的創新方法與公式解析2.1 信號建模與問題轉化2.2 截斷奇異值分解(TSVD)…