WebAssembly,wasm返回字符串

2021-04-22 08:50:32

参考地址 emscripten、 WebAssembly,传递字符串给c函数


可以用这个方法来实现 wasm AES加密


也可以参考现成的库,来改成自己需要的方法。 aes-wasm

下面看具体的实例。


下面的代码是一个C函数,实现简单的字符串拼接,然后返回拼接的字符串。

#include <stdio.h>#include <string>

 char* EMSCRIPTEN_KEEPALIVE outName(char *n){

 char xhName[] = "xuanhun";
 strcat(n, xhName);
 return n;}


下面使用命令进行编译:

emcc hello.cc -o test2.js


然后在页面中引用:

<script>
        Module = {};
        Module.onRuntimeInitialized = function () {

 var ptr = allocate(
            intArrayFromString("玄魂"),
 'i8',
              ALLOC_NORMAL);

 var retPtr = Module._outName(ptr);

 var resValue = Pointer_stringify(retPtr);
 console.log(resValue);

            _free(ptr);

        }
 </script>
 <script src="test2.js"></script>


上面的代码我们核心部分逐行分析一下:

  var ptr = allocate(intArrayFromString("玄魂"), 
 'i8', ALLOC_NORMAL);


上面的intArrayFromString方法,将字符串转换为UTF8的char数组,然后allocate 方法开辟内存空间存储数据,返回指针。

 var retPtr = Module._outName(ptr);


调用C导出函数,传入字符串指针。

 var resValue = Pointer_stringify(retPtr);


调用Pointer_stringify胶水函数,将c返回的指针转换为字符串。

   _free(ptr);


释放内存。

下面查看下运行结果:




  • 2019-12-11 16:21:00

    .vue文件 加scoped 样式不起作用

    在vue组件中,为了使样式私有化(模块化),不对全局造成污染,在style标签上添加scoped属性,以表示它只属于当下的模块。但是要慎用,因为在我们需要修改公共组件(第三方库或者项目中定制的组件)的样式的时候,scoped会造成很多困难,组要增加额外的复杂度。

  • 2019-12-11 16:22:04

    Vue中的scoped和scoped穿透,scoped原理

    在Vue文件中的style标签上有一个特殊的属性,scoped。当一个style标签拥有scoped属性时候,它的css样式只能用于当前的Vue组件,可以使组件的样式不相互污染。如果一个项目的所有style标签都加上了scoped属性,相当于实现了样式的模块化。

  • 2019-12-12 14:19:32

    laravel自定义分页LengthAwarePaginator

    有时候我们使用larave提供的后台分页数据库查询,有时候限制太多,我们需要自己定制分页功能。 下面是我给大家一个例子,我们可以根据例子,制作自己的分页功能。

  • 2019-12-14 21:04:05

    聊聊keep-alive组件的使用及其实现原理

    keep-alive是Vue.js的一个内置组件。它能够不活动的组件实例保存在内存中,而不是直接将其销毁,它是一个抽象组件,不会被渲染到真实DOM中,也不会出现在父组件链中。 它提供了include与exclude两个属性,允许组件有条件地进行缓存。

  • 2019-12-14 21:06:58

    vue----keep-alive缓存,activated,deactivated两个生命周期函数,,meta实现缓存

    如果没有缓存,每点击一次导航,内容区就会创建一个组件,该组件会经历整个生命周期,每点击一次,就会创建一个组件,比较浪费性能, 这时,我们就要考虑到是否能将点击过的已创建的组件进行缓存,当再次点击已访问过的组件时,这时,就会从缓存中获取该组件,而不会重新创建,