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,空字符当做普通字符处理
转载于:https://www.cnblogs.com/yanwei-wang/p/4781663.html
erlang nif小结相关推荐
- 【erlang】吃螃蟹 rust 开发 erlang nif 的正确方式 rustler
用rust编写erlang的nif方案,以下几个star比较高 Rustler ( https://github.com/hansihe/rustler ) 这个比较火,但是没有关于如何在 Erlan ...
- erlang nif 中文手册
这是翻译erlang官方文档中的 erts-5.9.2的erl_nif部分.翻译完了.水平有限,我就把这个当作是我自己使用了,以后也会继续完善的. erlang nif 中文手册 概括 功能 初始化 ...
- protobuff的erlang nif封装
服务器协议一直以来都使用erlang-protobuff,项目地址:https://github.com/ngerakines/erlang_protobuffs,但觉得效率不行,于是想优化一下,思路 ...
- 使用 Rust 语言开发 Erlang NIF
Rustler 项目还不是很成熟, 基本可用. 有兴趣的可以给作者提 Issue. Rustler 是一个在安全的用 Rust 编写 Erlang NIF 的库. 这里安全的含义是, 它不会导致 BE ...
- 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 ...
- linux野指针追踪,一个erlang nif野指针的追踪过程
概述 最近半年, 经常出现一些奇怪的bug. CPU非常高, 但etop并没有red特别高的进程. 内存占用非常高, 和etop看到的内存不吻合. coredump. 因为erlang层面无法定位问题 ...
- erlang NIF部分接口实现(四)消息发送
erlang中不能没有消息和异步过程,NIF也必须有此项能力,这个能力是通过enif_send实现的,它可以在NIF中向一个进程发送消息,但由于消息本身需要跨进程传递,消息的生命周期可能很长,而在er ...
- Erlang NIF使用
Erlang NIF使用 NIF库是Erlang源码里经常出现的东西,它像其他函数一样被调用,对调用方来说没区别,本身为C实现,效率较高,今天在Linux下测试一下NIF的自定义实现过程 在Erlan ...
- Erlang NIF的使用
Native Implemented Functions(NIF)可以用C来实现程序一些功能的扩展,一般用来实现一些用Erlang无法实现或者实现效率低的功能. C语言编译生成的动态库(*.so)在E ...
最新文章
- C++ inline内联函数
- Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO
- java中p.name_spring如何使用命名空间p简化bean的配置
- arcgis分隔图层重复出文件_【干货】ArcGIS不可或缺的制图技巧,处理好细节才能让图更专业!...
- c# 火狐浏览器怎么嵌入窗体中_「C#上位机必看」你们想要的练手项目来了
- AndroidStudio快捷键大全
- BZOJ2038[2009国家集训队] 小Z的袜子(hose)
- dom控制html元素编号,JavaScript DOM对象控制HTML元素详解
- 图片存储解决方案--阿里云OSS
- 初中英语语法(011)-形容词
- BP,RNN 和 LSTM暨《Supervised Sequence Labelling with Recurrent Neural Networks-2012》阅读笔记
- 极品-React中的DOM虚拟DOM,与deff算法,router
- 16 医疗挂号系统_【预约下单】
- 用js写出水仙花数_JavaScript求取水仙花数
- 2019年全国大学生电子设计竞赛综合测评
- 解决uniapp map遮盖遮罩层
- 好家伙,查看系统日志时我捕获了一只发生概率小于万分之一的Bug
- 字符串分割、切片、替换、去除头尾指定字符
- ann flann alglibB最近邻方法时效性探索
- 蓄电池内阻的检测技术
热门文章
- 小学计算机教育实习教案,信息技术环境下小学综合实践活动课教学设计
- 第一次随笔之寒假作业一
- 【源码】物理信息神经网络设计与仿真
- CVPR人工智能成精记,不但看穿PS,还能一键卸妆
- c语言程序设计书实验电子版,C语言程序设计实验与习题指导(第3版) pdf epub mobi txt 下载...
- 记录可控硅控制电路不能完全关闭的问题解决
- 帕累托法则(Pareto‘s principle)如何运用_Mr.D
- 水环境监测与治理类毕业论文文献有哪些?
- 网站服务器和虚拟主机之间有什么区别?
- Scrm是什么意思 和crm系统有什么区别