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

转载于:https://www.cnblogs.com/yanwei-wang/p/4781663.html

erlang nif小结相关推荐

  1. 【erlang】吃螃蟹 rust 开发 erlang nif 的正确方式 rustler

    用rust编写erlang的nif方案,以下几个star比较高 Rustler ( https://github.com/hansihe/rustler ) 这个比较火,但是没有关于如何在 Erlan ...

  2. erlang nif 中文手册

    这是翻译erlang官方文档中的 erts-5.9.2的erl_nif部分.翻译完了.水平有限,我就把这个当作是我自己使用了,以后也会继续完善的. erlang nif 中文手册 概括 功能 初始化 ...

  3. protobuff的erlang nif封装

    服务器协议一直以来都使用erlang-protobuff,项目地址:https://github.com/ngerakines/erlang_protobuffs,但觉得效率不行,于是想优化一下,思路 ...

  4. 使用 Rust 语言开发 Erlang NIF

    Rustler 项目还不是很成熟, 基本可用. 有兴趣的可以给作者提 Issue. Rustler 是一个在安全的用 Rust 编写 Erlang NIF 的库. 这里安全的含义是, 它不会导致 BE ...

  5. erlang nif windows x64 Failed to load NIF library : 'Unspecified error'

    erlang nif when run on windows x64, error like this ; {error,{load_failed,"Failed to load NIF l ...

  6. linux野指针追踪,一个erlang nif野指针的追踪过程

    概述 最近半年, 经常出现一些奇怪的bug. CPU非常高, 但etop并没有red特别高的进程. 内存占用非常高, 和etop看到的内存不吻合. coredump. 因为erlang层面无法定位问题 ...

  7. erlang NIF部分接口实现(四)消息发送

    erlang中不能没有消息和异步过程,NIF也必须有此项能力,这个能力是通过enif_send实现的,它可以在NIF中向一个进程发送消息,但由于消息本身需要跨进程传递,消息的生命周期可能很长,而在er ...

  8. Erlang NIF使用

    Erlang NIF使用 NIF库是Erlang源码里经常出现的东西,它像其他函数一样被调用,对调用方来说没区别,本身为C实现,效率较高,今天在Linux下测试一下NIF的自定义实现过程 在Erlan ...

  9. Erlang NIF的使用

    Native Implemented Functions(NIF)可以用C来实现程序一些功能的扩展,一般用来实现一些用Erlang无法实现或者实现效率低的功能. C语言编译生成的动态库(*.so)在E ...

最新文章

  1. C++ inline内联函数
  2. Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO
  3. java中p.name_spring如何使用命名空间p简化bean的配置
  4. arcgis分隔图层重复出文件_【干货】ArcGIS不可或缺的制图技巧,处理好细节才能让图更专业!...
  5. c# 火狐浏览器怎么嵌入窗体中_「C#上位机必看」你们想要的练手项目来了
  6. AndroidStudio快捷键大全
  7. BZOJ2038[2009国家集训队] 小Z的袜子(hose)
  8. dom控制html元素编号,JavaScript DOM对象控制HTML元素详解
  9. 图片存储解决方案--阿里云OSS
  10. 初中英语语法(011)-形容词
  11. BP,RNN 和 LSTM暨《Supervised Sequence Labelling with Recurrent Neural Networks-2012》阅读笔记
  12. 极品-React中的DOM虚拟DOM,与deff算法,router
  13. 16 医疗挂号系统_【预约下单】
  14. 用js写出水仙花数_JavaScript求取水仙花数
  15. 2019年全国大学生电子设计竞赛综合测评
  16. 解决uniapp map遮盖遮罩层
  17. 好家伙,查看系统日志时我捕获了一只发生概率小于万分之一的Bug
  18. 字符串分割、切片、替换、去除头尾指定字符
  19. ann flann alglibB最近邻方法时效性探索
  20. 蓄电池内阻的检测技术

热门文章

  1. 小学计算机教育实习教案,信息技术环境下小学综合实践活动课教学设计
  2. 第一次随笔之寒假作业一
  3. 【源码】物理信息神经网络设计与仿真
  4. CVPR人工智能成精记,不但看穿PS,还能一键卸妆
  5. c语言程序设计书实验电子版,C语言程序设计实验与习题指导(第3版) pdf epub mobi txt 下载...
  6. 记录可控硅控制电路不能完全关闭的问题解决
  7. 帕累托法则(Pareto‘s principle)如何运用_Mr.D
  8. 水环境监测与治理类毕业论文文献有哪些?
  9. 网站服务器和虚拟主机之间有什么区别?
  10. Scrm是什么意思 和crm系统有什么区别