erlang nif小结
一、nif获取string参数的两种方式
1、eif_get_string
实例如下:
static ERL_NIF_TERM erl_sm4_encrypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{ unsigned int input_len = 0;
unsigned int key_len = 1024;
char key_string[1024] = {0}; int output_len = sizeof(buff);
enif_get_list_length(env, argv[0],&input_len); char *input_string = NULL;
if (input_len <= 1)
input_len = 2018;
else
input_len = input_len +1; input_string = (char*)malloc(input_len);
memset(input_string,0x00,input_len); enif_get_string(env,argv[0],input_string,input_len, ERL_NIF_LATIN1);
enif_get_string(env,argv[1],key_string,key_len, ERL_NIF_LATIN1);
printf("input_string=%s,input_len=%d,key_string=%s,key_len=%d\n", input_string,input_len,key_string,key_len);
SM4_KEY iKey;
sm4_SetKey(&iKey, (unsigned char *)key_string, 1);
printf("ERK=%s,DRK=%s,MK=%s\n", iKey.ERK,iKey.DRK,iKey.MK);
enin_sm4((unsigned char*)input_string,input_len,buff,&output_len, &iKey, 1);
memset(buff+output_len,0x00,sizeof(buff)-output_len); free(input_string);
input_string = NULL;
return enif_make_string_len(env, (const char *)buff, output_len,ERL_NIF_LATIN1);
}
2、enif_inspect_iolist_as_binary
static ERL_NIF_TERM erl_sm4_encrypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
ErlNifBinary ebinary_input,ebinary_key; if (!enif_inspect_iolist_as_binary(env, argv[0], &ebinary_input) ||
!enif_inspect_iolist_as_binary(env, argv[1], &ebinary_key)){ return enif_make_badarg(env);
} int key_len = ebinary_key.size;
int input_len = ebinary_input.size;
int output_len = sizeof(buff); unsigned char *input_string = (unsigned char*)malloc(input_len+1);
unsigned char *key_string = (unsigned char*)malloc(key_len+1); 18 memcpy(input_string, ebinary_input.data, input_len);
19 memcpy(key_string, ebinary_input.data, key_len);
//printf("input_string=%s,input_len=%d,key_string=%s,key_len=%d\n", input_string,input_len,key_string,key_len); SM4_KEY iKey;
sm4_SetKey(&iKey, key_string, 1); memset(buff,0x00,sizeof(buff));
enin_sm4(input_string,input_len,buff,&output_len, &iKey, 1);
memset(buff+output_len,'\0',sizeof(buff)-output_len); free(input_string);
free(key_string);
return enif_make_string_len(env, (const char *)buff, output_len,ERL_NIF_LATIN1);
}
二、nif返回string的两种方式
1、enif_make_string
ERL_NIF_TERM enif_make_string(ErlNifEnv* env, const char* string, ErlNifCharEncoding encoding)
返回一个以空字符结尾的string
2、enif_make_string_len
ERL_NIF_TERM enif_make_string_len(ErlNifEnv* env, const char* string, size_t len, ErlNifCharEncoding encoding)
返回一个长度为len的字符串string,空字符当做普通字符处理
erlang nif小结的更多相关文章
- OTP gen_server
erlang behaviour小结之gen_server OTP入门 分类: Erlang2012-08-06 18:55 867人阅读 评论(0) 收藏 举报 servererlangcallba ...
- Windows下使用NIF扩展Erlang方法
在Erlang中,NIF(Native Implemented Function)被用来扩展erlang的某些功能,一般用来实现一些erlang很难实现的,或者一些erlang实现效率不高的功能. N ...
- 转载: 让我们聊聊Erlang的nif中资源的安全释放
让我们聊聊Erlang的nif中资源的安全释放 http://my.oschina.net/u/236698/blog/479221
- Erlang/OTP 17.0-rc1 新引入的"脏调度器"浅析
最近在做一些和 NIF 有关的事情,看到 OTP 团队发布的 17 rc1 引入了一个新的特性“脏调度器”,为的是解决 NIF 运行时间过长耗死调度器的问题.本文首先简单介绍脏调度器机制的用法,然后简 ...
- Erlang 虚拟机内的内存管理(Lukas Larsson演讲听写稿)
Erlang核心开发者Lukas Larsson在2014年3月份Erlang Factory上的一个演讲详细介绍了Erlang内存体系的原理以及调优案例: http://www.erlang-fac ...
- erlang note
没有关于erlang interface ,继续寻找吧... --------------------------------------------------------------- erl - ...
- Erlang 的新数据结构 map 浅析
更新:文中示例代码直接从Joe的新版 Erlang 书中摘抄而来,其中模式匹配的代码有错误,现已纠正.应该用 := 匹配字段,而不是 => . 即将发布的 Erlang 17 最大变化之一包括新 ...
- 为什么Erlang比C慢那么多倍?
Erlang 一直以慢“著称”,本文就来看看 Erlang 慢在什么地方,为什么比实现同样功能的 C 语言程序慢那么多倍.Erlang 作为一种虚拟机解释的语言,慢是当然的.不过本文从细节上分析为什么 ...
- Erlang库 -- 有意思的库汇总
抄自这里 首先,库存在的目的大致可分为:1.提供便利2.尽可能解决一些痛点 首先,我们先明确一下Erlang编程语言的一些痛点(伪痛点):1,单进程问题Erlang虚拟机属于抢占式调度,抢占式调度有很 ...
随机推荐
- Android开源库loopj的android-async-http的 JsonHttpResponseHandler 存在死循环GC_CONCURRENT
我现在用的是 AndroidAsyncHttp 1.4.4 版本,之前遇到一个很奇怪的问题, 当使用 JsonHttpResponseHandler 解析请求的页面出现服务器错误或其他情况返回的内容不 ...
- ASP.NET网站怎么发布 Web项目程序怎么发布部署(暂时收藏)
Web程序如何发布部署呢.网站项目做好了,需要发布出来,提交给客户,装上服务器.那怎么在ASP.NET开发环境中将网站程序发布出来呢 ^_^ 工具/原料 Visual Studio 2010 ( ...
- 图像处理_imgproc笔记(1)
图像处理_滤波器 (1)图像的平滑处理 图像的平滑也称模糊,平滑处理需要一个滤波器,最常用的滤波器就是线性滤波器,线性滤波器的输出像素值是g(x,y),是输入像素值是 f(x,y)的加权和: ...
- js数组中的注意
1.数组删除 2.数组合并 3.原数组会被修改的数组方法有: 1)排序 .sotr() 2)逆序 .reverse() 3)数组拼接 .splice()
- flex 4 datagrid 奇偶行颜色设置
<s:DataGrid width="100%" height="100%" alternatingRowColors="[#ffFFff,#e ...
- 洛谷-谁拿了最多奖学金-NOIP2005提高组复赛
题目描述 Description 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖学金,每人8000元,期末平均成绩高于80分(>8 ...
- Spring Boot--war发布
启动main类继承SpringBootServletInitializer,并重写"protected SpringApplicationBuilder configure(SpringAp ...
- nginx trouble shooting
除去配置语法失误.逻辑失误 nginx中的大部分问题都是前端到后端联通性 curl 域名没反应 cyr@test:/etc/nginx/sites-enabled$ curl test.hehe.ex ...
- 我喜欢的两个js类实现方式
闭包实现 变量是不会变的:) var myApplication = function(){ var name = 'Yuri'; var age = '34'; var status = 'sing ...
- 安装Postgresql踩过的坑
PG安装相关的 1 系统语言的设置 PG的安装,和系统的locale设置有一定的关系,需要设置,如在.profile或.bashrc中 也可以运行下面的命令: dpkg-reconfigure lo ...