Error[8]: Undefined offset: 8, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我试图让我很容易在Perl和我的C库之间移动二进制数据. 我创建了一个c结构来处理binary_data: struct binary_data { unsigned long length; unsigned char *data;}; 在我的SWIG界面文件中,我有以下内容: %typemap(in) binary_data * (binary_data temp) { 我试图让我很容易在Perl和我的C库之间移动二进制数据.

我创建了一个c结构来处理binary_data:

struct binary_data {    unsigned long length;    unsigned char *data;};

在我的SWIG界面文件中,我有以下内容:

%typemap(in) binary_data * (binary_data temp) {    STRLEN len;    unsigned char *outPtr;    if(!SvPOK($input))        croak("argument must be a scalar string");    outPtr = (unsigned char*) SvPV($input,len);        printf("set binary_data '%s' [%d] (0x%X)\n",outPtr,len,$input);    temp.data = outPtr;    temp.length = len;     = &temp;}%typemap(out) binary_data * {  SV *obj = sv_newmortal();  if ( != 0 && ->data != 0 && ->length > 0) {         sv_setpvn(obj,(const char*) ->data,->length);    printf("get binary_data '%s' [%d] (0x%X)\n",->data,->length,obj);  } else {    sv_setsv(obj,&PL_sv_undef);    printf("get binary_data [set to undef]\n");  }  if( !SvPOK(obj) )    croak("The result is not a scalar string");   $result = obj;}

我通过“ExtUtils :: MakeMaker”构建了我的Perl模块,这一切都很好.

然后我运行以下perl测试脚本以确保二进制数据正在运行
正确设置/获取perl字符串.

my $fr = ObjectThatContainsBinaryData->new();my $data = "1234567890"; print ">>>PERL:swig_data_set\n"; $fr->swig_data_set($data);print "<<<PERL:swig_data_set\n";print ">>>PERL:swig_data_get\n"; my $rdata = $fr->swig_data_get();print "<<<PERL: swig_data_get\n";print "sent    :" . $data . " len=" . length($data). " '$data'\n"     ."recIEved:". $rdata.  " len=" . length($rdata). " '$rdata'\n";

现在合并的C和Perl printf标准输出是:

>>>PERL:swig_data_setset binary_data '1234567890' [10] (0x12B204D0)<<<PERL:swig_data_set>>>PERL:swig_data_getget binary_data '1234567890' [10] (0x1298E4E0)<<<PERL: swig_data_getsent    :SCALAR(0x12b204d0) len=10 '1234567890'recIEved:SCALAR(0x12bc71c0) len=0 ''

那么为什么看起来对sv_setpvn的perl调用失败或无效?
我不知道为什么当我在perl中打印返回的二进制数据时,它显示为空标量,但在SWIG C嵌入式类型映射中看起来很好.

我正在使用:

为x86_64-linux-thread-multi构建的Perl v5.8.8

SWIG 2.0.1

gcc版本4.1.1 20070105(Red Hat 4.1.1-52)

解决方法 如果替换%typemap(out)中的以下行:

$result = obj;

$result = obj; argvi++;  //This is a Hack to get the hIDden stack pointer to increment before the return

SWIG生成的代码现在看起来像:

...  ST(argvi) = obj; argvi++;}XSRETURN(argvi);}

并且您的测试脚本将按预期返回Perl String.

SV = PV(0x1eae7d40) at 0x1eac64d0  REFCNT = 1  FLAGS = (PADBUSY,PADMY,POK,pPOK)  PV = 0x1eb25870 "1234567890"[+++]  CUR = 10  LEN = 16<<<PERL: swig_data_getsent    :SCALAR(0x1ea64530) len=10 '1234567890'recIEved:SCALAR(0x1eac64d0) len=10 '1234567890'

您应该更仔细地阅读有关Perl中的类型映射的SWIG 2.0文档:


30.8.2返回值

返回值放在每个包装函数的参数堆栈上.参数堆栈指针的当前值包含在变量argvi中.每当添加新的输出值时,增加该值是至关重要的.对于多个输出值,argvi的最终值应为输出值的总数.“

总结

以上是内存溢出为你收集整理的使用SWIG将二进制数据移入/移出Perl全部内容,希望文章能够帮你解决使用SWIG将二进制数据移入/移出Perl所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
使用SWIG将二进制数据移入移出Perl_语言综合_内存溢出

使用SWIG将二进制数据移入移出Perl

使用SWIG将二进制数据移入移出Perl,第1张

概述我试图让我很容易在Perl和我的C库之间移动二进制数据. 我创建了一个c结构来处理binary_data: struct binary_data { unsigned long length; unsigned char *data;}; 在我的SWIG界面文件中,我有以下内容: %typemap(in) binary_data * (binary_data temp) { 我试图让我很容易在Perl和我的C库之间移动二进制数据.

我创建了一个c结构来处理binary_data:

struct binary_data {    unsigned long length;    unsigned char *data;};

在我的SWIG界面文件中,我有以下内容:

%typemap(in) binary_data * (binary_data temp) {    STRLEN len;    unsigned char *outPtr;    if(!SvPOK($input))        croak("argument must be a scalar string");    outPtr = (unsigned char*) SvPV($input,len);        printf("set binary_data '%s' [%d] (0x%X)\n",outPtr,len,$input);    temp.data = outPtr;    temp.length = len;     = &temp;}%typemap(out) binary_data * {  SV *obj = sv_newmortal();  if ( != 0 && ->data != 0 && ->length > 0) {         sv_setpvn(obj,(const char*) ->data,->length);    printf("get binary_data '%s' [%d] (0x%X)\n",->data,->length,obj);  } else {    sv_setsv(obj,&PL_sv_undef);    printf("get binary_data [set to undef]\n");  }  if( !SvPOK(obj) )    croak("The result is not a scalar string");   $result = obj;}

我通过“ExtUtils :: MakeMaker”构建了我的Perl模块,这一切都很好.

然后我运行以下perl测试脚本以确保二进制数据正在运行
正确设置/获取perl字符串.

my $fr = ObjectThatContainsBinaryData->new();my $data = "1234567890"; print ">>>PERL:swig_data_set\n"; $fr->swig_data_set($data);print "<<<PERL:swig_data_set\n";print ">>>PERL:swig_data_get\n"; my $rdata = $fr->swig_data_get();print "<<<PERL: swig_data_get\n";print "sent    :" . $data . " len=" . length($data). " '$data'\n"     ."recIEved:". $rdata.  " len=" . length($rdata). " '$rdata'\n";

现在合并的C和Perl printf标准输出是:

>>>PERL:swig_data_setset binary_data '1234567890' [10] (0x12B204D0)<<<PERL:swig_data_set>>>PERL:swig_data_getget binary_data '1234567890' [10] (0x1298E4E0)<<<PERL: swig_data_getsent    :SCALAR(0x12b204d0) len=10 '1234567890'recIEved:SCALAR(0x12bc71c0) len=0 ''

那么为什么看起来对sv_setpvn的perl调用失败或无效?
我不知道为什么当我在perl中打印返回的二进制数据时,它显示为空标量,但在SWIG C嵌入式类型映射中看起来很好.

我正在使用:

为x86_64-linux-thread-multi构建的Perl v5.8.8

SWIG 2.0.1

gcc版本4.1.1 20070105(Red Hat 4.1.1-52)

解决方法 如果替换%typemap(out)中的以下行:

$result = obj;

$result = obj; argvi++;  //This is a Hack to get the hIDden stack pointer to increment before the return

SWIG生成的代码现在看起来像:

...  ST(argvi) = obj; argvi++;}XSRETURN(argvi);}

并且您的测试脚本将按预期返回Perl String.

SV = PV(0x1eae7d40) at 0x1eac64d0  REFCNT = 1  FLAGS = (PADBUSY,PADMY,POK,pPOK)  PV = 0x1eb25870 "1234567890"  CUR = 10  LEN = 16<<<PERL: swig_data_getsent    :SCALAR(0x1ea64530) len=10 '1234567890'recIEved:SCALAR(0x1eac64d0) len=10 '1234567890'

您应该更仔细地阅读有关Perl中的类型映射的SWIG 2.0文档:


30.8.2返回值

返回值放在每个包装函数的参数堆栈上.参数堆栈指针的当前值包含在变量argvi中.每当添加新的输出值时,增加该值是至关重要的.对于多个输出值,argvi的最终值应为输出值的总数.“

总结

以上是内存溢出为你收集整理的使用SWIG将二进制数据移入/移出Perl全部内容,希望文章能够帮你解决使用SWIG将二进制数据移入/移出Perl所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1239275.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存