Electron使用WebAassembly实现CRC-8 MAXIM校验

embedded/2025/2/3 0:00:06/

Electron使用WebAssembly实现CRC-8 MAXIM校验

将C/C++语言代码,经由WebAssembly编译为库函数,可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-8 MAXIM格式校验的方式。

CRC-8 MAXIM校验函数WebAssebly源文件

C语言实现CRC-8 MAXIM格式校验的介绍见:《C语言CRC-8 MAXIM格式校验函数》

选择上面介绍文章中的uint8_t PY_CRC_8_T_MAXIM_i(uint8_t *di, uint32_t len)校验函数,建立一个新文件PY_CRC_8_T_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(uint8_t) PY_CRC_8_T_MAXIM_i(uint8_t *di, uint32_t len) {    uint8_t crc_poly = 0x8C; //Bit sequence inversion of 0x31uint8_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 & 0x01)data_t = (data_t >> 1) ^ crc_poly;elsedata_t >>= 1;}}return data_t;
}

这个文件有三个函数导出,前两个是获取和释放内存的函数,后一个就是CRC-8 MAXIM校验函数的导出。

将这个文件进行WebAssembly编译,就会得到两个库文件:

在这里插入图片描述

将这几个文件拷贝到后面建立的Electron工程目录,再进行调用。

Electron调用WebAssembly CRC-8 MAXIM函数演示源文件

下载Electron的Hello World!例程,并实现正常运行:
在这里插入图片描述

然后将前面的3个WebAssembly相关文件,放到例程根目录。再引入一个jQuery库。编写index.html文件如下:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>WebAssembly Electron</title><script>window.$ = window.jQuery = require('./js/jquery-3.3.1.min.js');</script></head><body><h1>Hello World!</h1><!-- All of the Node.js APIs are available in this renderer process. -->We are using Node.js <script>document.write(process.versions.node)</script>,Chromium <script>document.write(process.versions.chrome)</script>,Electron <script>document.write(process.versions.electron)</script>,<p> see console </p><script src="PY_CRC_8_T_MAXIM_i.js"></script><script src="./mainprocess.js"></script>  </body><script>// You can also require other files to run in this processrequire('./renderer.js')</script>
</html>

主要修改部分为引入了jQuery,引入了PY_CRC_8_T_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_8_T_MAXIM_i(ptr, count));Module._myfree(ptr);},2000);   //Delay is a must for Module initialized! })

mainprocess.js实现了WebAssembly库文件的导入和使用,Module._mymalloc用于申请内存空间,Module._myfree用于释放内存空间,Module.HEAP8[ptr + i] = 1+i;用于给申请到的内存空间从1开始赋值,这里堆空间为8个字节,因此赋值从1到8。Module._PY_CRC_8_T_MAXIM_i(ptr, count)则进行CRC-8 MAXIM校验函数的调用,提供了内存指针和要校验的字节数量。

整个Electron工程环境的文件如下所示:
在这里插入图片描述

Electron调用WebAssembly CRC-8 MAXIM函数演示效果

通过在控制台输入 npm start执行Electron工程,打开console显示:
在这里插入图片描述
131是打印出的CRC校验结果,十六进制值为0x83, 通过在线工具比较验证:
在这里插入图片描述

Electron使用WebAassembly实现CRC-8 MAXIM校验演示工程下载

Electron Demo工程下载,包含已编译后的WebAssembly库文件:
在这里插入图片描述

–End–


http://www.ppmy.cn/embedded/159039.html

相关文章

记录一次Sqoop从MySQL导入数据到Hive问题的排查经过

个人博客地址:记录一次Sqoop从MySQL导入数据到Hive问题的排查经过 | 一张假钞的真实世界 问题描述 MySQL中原始数据有790W+的记录数,在Sqoop抽取作业成功的情况下在Hive中只有500W左右的记录数。 排查过程 数据导入脚本Log 通过Log可以发现以下信息: 该Sqoop任务被分解…

深入了解 HTTP 头部中的 Accept-Encoding:gzip、deflate、br、zstd

在现代Web开发中&#xff0c;性能优化是至关重要的一部分。HTTP协议中的Accept-Encoding头部正是为性能提升提供了一个非常有效的方式&#xff0c;它告知服务器客户端能够理解并接收哪些压缩算法的响应内容。在这篇博客中&#xff0c;我们将详细探讨Accept-Encoding头部的作用&…

go到底是什么意思:对go的猜测或断言

go这个单词&#xff0c;简单地讲&#xff0c;表示“走或去”的意思&#xff1a; go v.去&#xff1b;走 认真想想&#xff0c;go是一个非常神秘的单词&#xff0c;g-和o-这两个字母&#xff0c;为什么就会表达“去&#xff1b;走”的意思呢&#xff1f;它的字面义或本质&…

cursor软件的chat和composer分别是什么

Cursor 是一款基于人工智能的代码编辑器&#xff0c;集成了类似 ChatGPT 的功能&#xff0c;旨在帮助开发者更高效地编写代码。以下是 Cursor 中 Chat 和 Composer 的具体功能&#xff1a; 1. Chat Cursor 中的 Chat 是一个基于 AI 的聊天功能&#xff0c;类似于 ChatGPT&…

10.[前端开发-CSS]Day10-CSS的浮动和flex布局

一、CSS的Flex布局 1 认识flex布局 认识flexbox 原先的布局存在的痛点 flex布局的出现 2 flex布局的理解 flex布局的重要概念 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Com…

2502,dll导出C++类

C语言毕竟能和窗口DLL可和平共处. 介绍 自从窗口的开始阶段,动态链接库(DLL)就是窗口平台的一个组成部分.动态链接库,允许在一个独立的模块中封装一系列的功能函数,然后以一个显式的C函数列表供外部用户使用. 在上个世纪80年代,当窗口DLL面世时,对广大程序员而言只有C语言是…

深度学习篇---数据存储类型

文章目录 前言第一部分&#xff1a;C语言中的数据存储类型1. char&#xff08;通常是8位&#xff09;优点缺点 2. short&#xff08;通常是16位&#xff09;优点缺点 3. int&#xff08;通常是32位&#xff09;优点缺点 4. long&#xff08;通常是32位或64位&#xff09;优点缺…

如何移植ftp服务器到arm板子?

很多厂家提供的sdk&#xff0c;一般都不自带ftp服务器功能&#xff0c; 需要要发人员自己移植ftp服务器程序。 本文手把手教大家如何移植ftp server到arm板子。 环境 sdk&#xff1a;复旦微 Buildroot 2018.02.31. 解压 $ mkdir ~/vsftpd $ cp vsftpd-3.0.2.tar.gz ~/vs…