一、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小结的更多相关文章

  1. OTP gen_server

    erlang behaviour小结之gen_server OTP入门 分类: Erlang2012-08-06 18:55 867人阅读 评论(0) 收藏 举报 servererlangcallba ...

  2. Windows下使用NIF扩展Erlang方法

    在Erlang中,NIF(Native Implemented Function)被用来扩展erlang的某些功能,一般用来实现一些erlang很难实现的,或者一些erlang实现效率不高的功能. N ...

  3. 转载: 让我们聊聊Erlang的nif中资源的安全释放

    让我们聊聊Erlang的nif中资源的安全释放 http://my.oschina.net/u/236698/blog/479221

  4. Erlang/OTP 17.0-rc1 新引入的"脏调度器"浅析

    最近在做一些和 NIF 有关的事情,看到 OTP 团队发布的 17 rc1 引入了一个新的特性“脏调度器”,为的是解决 NIF 运行时间过长耗死调度器的问题.本文首先简单介绍脏调度器机制的用法,然后简 ...

  5. Erlang 虚拟机内的内存管理(Lukas Larsson演讲听写稿)

    Erlang核心开发者Lukas Larsson在2014年3月份Erlang Factory上的一个演讲详细介绍了Erlang内存体系的原理以及调优案例: http://www.erlang-fac ...

  6. erlang note

    没有关于erlang interface ,继续寻找吧... --------------------------------------------------------------- erl - ...

  7. Erlang 的新数据结构 map 浅析

    更新:文中示例代码直接从Joe的新版 Erlang 书中摘抄而来,其中模式匹配的代码有错误,现已纠正.应该用 := 匹配字段,而不是 => . 即将发布的 Erlang 17 最大变化之一包括新 ...

  8. 为什么Erlang比C慢那么多倍?

    Erlang 一直以慢“著称”,本文就来看看 Erlang 慢在什么地方,为什么比实现同样功能的 C 语言程序慢那么多倍.Erlang 作为一种虚拟机解释的语言,慢是当然的.不过本文从细节上分析为什么 ...

  9. Erlang库 -- 有意思的库汇总

    抄自这里 首先,库存在的目的大致可分为:1.提供便利2.尽可能解决一些痛点 首先,我们先明确一下Erlang编程语言的一些痛点(伪痛点):1,单进程问题Erlang虚拟机属于抢占式调度,抢占式调度有很 ...

随机推荐

  1. 2016 ACM/ICPC Asia Regional Qingdao Online

    吐槽: 群O的不是很舒服 不知道自己应该干嘛 怎样才能在团队中充分发挥自己价值 一点都不想写题 理想中的情况是想题丢给别人写 但明显滞后 一道题拖沓很久 中途出岔子又返回来搞 最放心的是微软微软妹可以 ...

  2. CodeForces 712D Memory and Scores

    $dp$,前缀和. 记$dp[i][j]$表示$i$轮结束之后,两人差值为$j$的方案数. 转移很容易想到,但是转移的复杂度是$O(2*k)$的,需要优化,观察一下可以发现可以用过前缀和来优化. 我把 ...

  3. November 12th 2016 Week 46th Saturday

    Never love anyone who treats you like you are ordinary. 请爱那些爱你的人. Don't waste your limited energy on ...

  4. asp.net <% = #区别

    <% = %>是将网页中定义的变量的值赋给控件: 例如:<input name="T_ClientAdd" type="text" id=&q ...

  5. 动态多条件查询分页以及排序(一)--MVC与Entity Framework版url分页版

    一.前言 多条件查询分页以及排序  每个系统里都会有这个的代码 做好这块 可以大大提高开发效率  所以博主分享下自己的6个版本的 多条件查询分页以及排序 二.目前状况 不论是ado.net 还是EF ...

  6. eclipse 启动tomcat后 页面无法访问tomcat首页

    在eclipse中新建tomcat7,完成后tomcat能够正常启动,但是浏览器问题localhost:8080访问不了. 解决方法如下: 双击eclipse中服务器中的tomcat 出现tomcat ...

  7. QCMediaPlayer mediaplayer NOT present(android)

    出现了“QCMediaPlayer mediaplayer NOT present”这个错误!!!我的手机是小米手机2,我给它刷机刷到了Android 4.4.4,后来我学长是这样解决的:case R ...

  8. juit测试中报错:org.hibernate.HibernateException: Unable to get the default Bean Validation factory

    org.hibernate.HibernateException: Unable to get the default Bean Validation factory 解决方法: 解决方案: 在hib ...

  9. js 冒泡排序

    var arr = []; for(var i=0; i<100000; i++){ arr.push(parseInt(Math.random()*100)) }; var t1 = Date ...

  10. kali rolling 安装typecho

    #1 apt-get install nginx php7.0 php7.0-mysql php7.0-gd php7.0-cgi php7.0-cli php7.0-curl php7.0-fpm ...