设为首页 收藏本站
查看: 989|回复: 0

[经验分享] nodejs C/C++ Addons 中的指针操作

[复制链接]

尚未签到

发表于 2017-2-22 12:14:19 | 显示全部楼层 |阅读模式
  刚看到这个标题的时候,大家会觉得比较奇怪,nodejs是一门脚本语言,它又没有“指针”这个数据结构,怎么能操作指针呢 ?这个问题关键就是nodejs中的Buffers这个数据结构。
  背景
  自己做的一个项目需要是从网站上下载一个图片,然后用libjpeg这个C类库对图像进行操作。程序架构是用nodejs写一个主运行程序,用C++扩展来调用libjpeg类库并实现底层的算法。libjpeg的8d版本中已经有两个接口解析图片信息,分别是从文件中读取和从内存中读取。



EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));
EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo,
                  unsigned char * inbuffer,
                  unsigned long insize));
  对应这两个接口,就有两套解决方案:1,先将图片下载到本地文件,然后再从本地文件读到内存; 2,直接将图片读取到本地内存。
  显而易见,第二种方案更优:节省了大量的磁盘IO,提升速度。那接下来的问题就是如何写nodejs的C++扩展,得到一块内存指针,这就需要buffers出马了。
  解决方案
  开始具体的解决方案之前需要先了解如何编写nodejs的C/C++扩展,还是比较简单的。没做过相关开发的同学可以参看以下文章:
  1. nodejs C/C++ Addon
  2. 编写nodejs原生扩展
  3. node-extension-examples
  nodejs中buffers是一个比较重要的数据结构,典型应用就是读取文件内容和发送http请求,它们都能到相关buffers。查看nodejs的源码就会发现有这样的api:



  static inline char* Data(v8::Handle<v8::Object> obj) {
    return (char*)obj->GetIndexedPropertiesExternalArrayData();
  }
  static inline char* Data(Buffer *b) {
    return Buffer::Data(b->handle_);
  }
  static inline size_t Length(v8::Handle<v8::Object> obj) {
    return (size_t)obj->GetIndexedPropertiesExternalArrayDataLength();
  }
  static inline size_t Length(Buffer *b) {
    return Buffer::Length(b->handle_);
  }
  通过Data()函数得到buffer的内存指针,通过Length()得到这块内存的大小,非常有用吧。
  这样的话,只要nodejs程序得到buffer,然后转化为v8中的object对象,再从这个object对象中得到这块内存的指针和内存大小,接下来就可以进行想要的指针操作了。重要的代码如下:



    Local<Value> arg1 = args[0];
    if (Buffer::HasInstance(arg1)) {
      size_t size = Buffer::Length(arg1->ToObject());
      char* bufferdata = Buffer::Data(arg1->ToObject());
      //to do with size and bufferdata
      
      return scope.Close(Number::New(size));
    }
    else{
      return scope.Close(Number::New(-1));
    }
  大功告成。
  完整的代码可以参见:https://github.com/jifeng/node-buffer-extends
  其他操作buffer的例子:https://github.com/bnoordhuis/node-buffertools/blob/master/buffertools.cc

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345750-1-1.html 上篇帖子: NodeJs通过async/await处理异步 下篇帖子: 让nodeJS支持ES6的词法----babel的安装和使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表