erlang nif小结

一、nif获取string参数的两种方式

1、eif_get_string

实例如下:

 1 static ERL_NIF_TERM erl_sm4_encrypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
 2 {
 3
 4     unsigned int input_len = 0;
 5     unsigned int key_len   = 1024;
 6     char key_string[1024]   = {0};
 7
 8     int output_len = sizeof(buff);
 9     enif_get_list_length(env, argv[0],&input_len);
10
11     char *input_string = NULL;
12     if (input_len <= 1)
13         input_len = 2018;
14     else
15         input_len = input_len +1;
16
17     input_string = (char*)malloc(input_len);
18     memset(input_string,0x00,input_len);
19
20     enif_get_string(env,argv[0],input_string,input_len, ERL_NIF_LATIN1);
21     enif_get_string(env,argv[1],key_string,key_len, ERL_NIF_LATIN1);
22     printf("input_string=%s,input_len=%d,key_string=%s,key_len=%d\n", input_string,input_len,key_string,key_len);
23     SM4_KEY iKey;
24     sm4_SetKey(&iKey, (unsigned char *)key_string, 1);
25     printf("ERK=%s,DRK=%s,MK=%s\n", iKey.ERK,iKey.DRK,iKey.MK);
26     enin_sm4((unsigned char*)input_string,input_len,buff,&output_len, &iKey, 1);
27     memset(buff+output_len,0x00,sizeof(buff)-output_len);
28
29     free(input_string);
30     input_string = NULL;
31     return enif_make_string_len(env, (const char *)buff, output_len,ERL_NIF_LATIN1);
32 }

2、enif_inspect_iolist_as_binary

 1 static ERL_NIF_TERM erl_sm4_encrypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
 2 {
 3     ErlNifBinary ebinary_input,ebinary_key;
 4
 5     if (!enif_inspect_iolist_as_binary(env, argv[0], &ebinary_input) ||
 6         !enif_inspect_iolist_as_binary(env, argv[1], &ebinary_key)){
 7
 8         return enif_make_badarg(env);
 9     }
10
11     int key_len   = ebinary_key.size;
12     int input_len = ebinary_input.size;
13     int output_len = sizeof(buff);
14
15     unsigned char *input_string = (unsigned char*)malloc(input_len+1);
16     unsigned char *key_string   = (unsigned char*)malloc(key_len+1);
17
18     memcpy(input_string, ebinary_input.data, input_len);
19     memcpy(key_string, ebinary_input.data, key_len);
20     //printf("input_string=%s,input_len=%d,key_string=%s,key_len=%d\n", input_string,input_len,key_string,key_len);
21
22     SM4_KEY iKey;
23     sm4_SetKey(&iKey, key_string, 1);
24
25     memset(buff,0x00,sizeof(buff));
26     enin_sm4(input_string,input_len,buff,&output_len, &iKey, 1);
27     memset(buff+output_len,‘\0‘,sizeof(buff)-output_len);
28
34     free(input_string);
35     free(key_string);
36     return enif_make_string_len(env, (const char *)buff, output_len,ERL_NIF_LATIN1);
37 }

二、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,空字符当做普通字符处理

时间: 2024-08-03 15:27:21

erlang nif小结的相关文章

Erlang Application

1.OTP应用组织模式 创建OTP应用时的主要工作集中于保准目录结构的建立和应用元数据的编写.元数据的作用在于让系统获悉应该如何启动和停止应用,还可用于指定应用的依赖项,也就是在应用启动前必须安装或启动哪些其它应用. 2.OTP应用布局 <application-name>[-<version>] | | - doc | - ebin | - include | - priv | - src otp应用布局目录.目录名可以包含版本号.标准子目录包括doc.ebin.include.

Erlang库 -- 有意思的库汇总

首先,库存在的目的大致可分为:1.提供便利2.尽可能解决一些痛点 首先,我们先明确一下Erlang编程语言的一些痛点(伪痛点):1,单进程问题Erlang虚拟机属于抢占式调度,抢占式调度有很多好处,但是同样也存在这弊端.虚拟机在默认情况下分配个每个进程的资源都是相同的,但是若一个进程(gen_server/event/fsm)要为其他许多进程提供服务,这个进程就极有可能成为整个Erlang系统的瓶颈所在.http://www.cnblogs.com/--00/p/4277640.html2,列表

硝烟中的Erlang -- Erlang生产系统问题诊断、调试、解决指南

英文原名:Stuff Goes Bad: Erlang In Anger 英文作者:FRED HEBERT 下载地址:http://vdisk.weibo.com/s/iGQ-rFuJU0-4 译者序 在我近20年的软件开发工作中,除了Erlang,还使用过许多其他编程语言.有工作需要的C/C++.Java,也有作为业余爱好使用的Lisp.Haskell.Scala等,其中我最喜欢的当属Erlang.除了因为我的电信软件开发背景外,还有一个很重要的原因是Erlang独特的设计哲学和解决问题方式.

Erlang与C构建的节点通讯

Erlang节点之间的通讯,主要用于两个Erlang节点之间的通讯,但Erlang还支持与java构建的节点通讯,甚至与c构建的节点通讯,前面两种方式在我以前的文章都有讲到,所以这里讲Erlang与c构建的节点通讯. Cnode与erl_interface 想用C构建一个erlang节点,要利用Erlang的erl_interface接口来实现.c建立的节点,叫CNode ,其中,erl_interface除了实现一些基本的节点连接,消息发送接收,还实现Erlang Term 的构建解析. CN

[Erlang 0004] Centos 源代码编译 安装 Erlang

原文地址: http://www.cnblogs.com/me-sa/archive/2011/07/09/erlang0004.html 由于最终部署的生产环境是Centos,所以我需要在Centos中安装Erlang B13R04 ,第一次做这件事情破费周折,主要是对Erlang依赖的库不熟悉,总是编译不过:这里梳理一下安装过程中的细节:   Erlang依赖哪些库? A fully working GCC compiler environment Ncurses development l

Rebar:Erlang构建工具

Rebar:Erlang构建工具 http://www.cnblogs.com/panfeng412/archive/2011/08/14/2137990.html Rebar是一款Erlang的构建工具,使用它可以方便的编译.测试erlang程序.内联驱动和打包Erlang发行版本. Rebar是一个独立的erlang脚本,所以使用Rebar发布程序非常简单,甚至可以直接集成在项目文件夹中.默认的情况下,Rebar会按照Erlang/OTP来组织项目的结构,这样一来,构建时的配置工作量就会大大

Erlang error?

Unable to load crypto library. Failed with error: "load_failed, Failed to load NIF library: '/usr/local/erlang/R16B03-1/lib/erlang/lib/crypto-3.2/priv/lib/crypto.so: undefined symbol: EC_GROUP_new_curve_GF2m'" OpenSSL might not be installed on t

分析erlang进程监控的实现

Erlang支持Monitor和Link两种监控进程的方式,使得所有进程可以连成一个整体.当某个进程出错退出时,监控进程会收到该进程退出的消息通知.有了这些特点,使用Erlang建立一个简单,并且健壮的系统就不是什么难事.前面有文章分析了两种方式的用法,这里分析下monitor和link的实现. 源码分析 monitor 和link实现有点类似,下面以monitor为例做说明(erlang版本R16B02) erlang:monitor/2的实现 // bif.c 实现 erlang:monit

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

Erlang核心开发者Lukas Larsson在2014年3月份Erlang Factory上的一个演讲详细介绍了Erlang内存体系的原理以及调优案例: http://www.erlang-factory.com/conference/show/conference-6/home/#lukas-larsson 在这里可以下载slides和观看视频(为了方便不方便科学上网的同学,我把视频搬运到了 http://v.youku.com/v_show/id_XNzA1MjA0OTEy.html )