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.mzph.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)…