当前位置: 首页 > news >正文

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 0x04C11DB7
	uint32_t data_t = 0xFFFFFFFF; //initial value

	for(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–

相关文章:

  • Java 大视界 -- Java 大数据机器学习模型的在线评估与持续优化(123)
  • leetcode 78. 子集(二进制枚举详解)c++
  • ubuntu 部署deepseek
  • 【Go万字洗髓经】Golang内存模型与内存分配管理
  • 【如何优化前端的网络请求?】
  • eclipse创建maven web项目
  • Spring学习笔记:工厂模式与反射机制实现解耦
  • delphi 正则提取html中的内容
  • AI自动化编程初探
  • 物理服务器的作用都有哪些?
  • Linux 环境变量快速上手指南
  • 汽车一键启动按钮更换注意事项
  • 机器学习 Day02,matplotlib库绘图
  • C++新特性
  • docker无法pull镜像问题解决for win10
  • C语言每日一练——day_3(快速上手C语言)
  • 伽马函数相关知识点及其与概率论知识的结合
  • 内网安全-横向移动PTH 哈希PTT 票据PTK 密匙Kerberos密码喷射
  • Nginx 配置 SSL(HTTPS)详解
  • 嵌入式学习第二十四天--网络 服务器
  • 搬瓦工putty做网站/百度搜索排行榜
  • 校园文化建设网站/汕头seo全网营销
  • 网页设计图片怎么放进去/seo双标题软件
  • 营销型网站设计文章/seo课程培训机构