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虚拟机属于抢占式调度,抢占式调度有很 ...
随机推荐
- Python 代码规范
命名 module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_VAR_NAME, ...
- CodeForces 670D Magic Powder
二分. 二分一下答案,然后验证一下. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cst ...
- C#基础--值类型和引用类型
C#中大多数类型都是引用类型,只有个别特殊情况是值类型. 值类型: 枚举(enum) 结构(struct) 基础类型:int, short, char, bool....(string是引用类型) 引 ...
- 在Eclipse中用TODO标签管理任务(Task)
Elipse为Java项目的时候,有一个很人性化的“任务管理”功能,利用这个功能可以方便地将项目中一些需要处理的任务记录下来.先来看看“任务管理”是怎么使用的吧.下面这个类在Class和name 属性 ...
- 五大科技巨头VR/AR专利报告,Magic Leap以22.6%领跑
在十月份发布的<VR/AR专利技术深度分析报告>指出,VR.AR行业的专利多被佳能.索尼.微软.谷歌等科技巨头"包养",但是并没有对这部分进行详细分析.近日,风投公司C ...
- teyi
$arr=array('haha'=>"苹果");print_r($arr['haha']); $arr=array(0=>"苹果");$arr=a ...
- Qt 外观之一 ——Qt Style Sheet
Qt Style Sheet 目录 使用 对于应用程序 创建自定义控件 QSS语法 一般选择器(selector) 伪选择器 解决冲突 使用specificity Namespace冲突 级联效应 设 ...
- maven 项目 pom.xml文件中配置的jar包下载报错
[ERROR] [ERROR] Some problems were encountered while processing the POMs:[ERROR] 'dependencies.depen ...
- x264宏块及子块划分方式
1 宏块划分方式 一副图像(帧,非场图像,x264支持宏块级场编码,这里以帧图像为例说明)按从左到右.从上到下16x16的方式划分宏块,对于图像宽度不是16的倍数的情况,会扩展至16的倍数,然后通过s ...
- Linux 虚拟机性能监控
性能监控工具 perf kvm 为了在主机中使用perf kvm,您必须访问/ proc / modules和/ proc / kallsyms文件."复制/ proc文件从guest虚拟机 ...