一、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. RockMongo 安装

    1. yum install php-pecl-http php 2. yum install httpd 3. yum install php-devel 4. pecl install mongo ...

  2. Dynamics CRM 相关资料

    links: 1.The Microsoft Dynamics CRM Team Blog 2.申请试用Dynamics CRM 2013 http://www.microsoft.com/zh-cn ...

  3. JavaScript里利用DOM获取宽高大全

    网页可见区域宽:document.body.clientWidth网页可见区域高:document.body.clientHeight网页可见区域宽:document.body.offsetWidth ...

  4. 实战荟萃-UI篇

    一. 前言 平时在处理问题的时候,经常会遇到一些奇奇怪怪的问题,今天在这里将其记录下来.这里将会列举几个常用的UI问题进行讲解 二. 导航栏 iOS导航栏绝对是个巨坑.和很多朋友聊天都是自己实现了一套 ...

  5. 关于angularjs依赖注入的整理

    初学angularjs阶段,刚刚看到菜鸟教程的angularjs依赖注入.现在整理一下: 1.含义:一个或更多的依赖(可以理解为模块关系依赖)或服务(分为内建服务[例如$http,$tiomeout等 ...

  6. CodeForces 566D 并查集集合合并

    #include <stdio.h> #include <algorithm> #define MAX 100000 #define LL long long #define ...

  7. Linux下Modules的概念及使用详解[转贴]

    一.什么是 modules? modules 的字面意思就是模块,在此指的是 kernel modules:简单来说,一个模块提供了一个功能,如 isofs.minix.nfs.lp 等等.传统来讲, ...

  8. HDU-1757--A Simple Math Problem(矩阵乘法)

    Problem Description Lele now is thinking about a simple function f(x).If x < 10 f(x) = x.If x > ...

  9. jquery选择器之基本筛选选择

    1.基本选择器 2.内容筛选选择器 3.可见性筛选选择器 4.属性筛选选择器 5.子元素筛选选择器 6.表单元素选择器 7.表单对象属性筛选器

  10. JqGrid相关操作

    JqGrid相关操作 根据jqGrid的文档,要想生成一个jqGrid,最直接的方法就是:$("#grid_id").jqGrid(options);也就是通过选择符得到一个tab ...