我想讓我在Perl和C++庫之間移動二進制數據變得簡單。使用SWIG將二進制數據移入/移出Perl
我創建了一個C++結構,以一手binary_data:
struct binary_data {
unsigned long length;
unsigned char *data;
};
在我痛飲接口文件,因爲我有以下幾點:
%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;
$1 = &temp;
}
%typemap(out) binary_data * {
SV *obj = sv_newmortal();
if ($1 != 0 && $1->data != 0 && $1->length > 0) {
sv_setpvn(obj, (const char*) $1->data, $1->length);
printf("get binary_data '%s' [%d] (0x%X)\n", $1->data, $1->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;
}
我建我的Perl模塊通過「的ExtUtils :: MakeMaker的「這一切都很好。
然後,我運行下面的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 stdout是:
>>>PERL:swig_data_set
set binary_data '1234567890' [10] (0x12B204D0)
<<<PERL:swig_data_set
>>>PERL:swig_data_get
get binary_data '1234567890' [10] (0x1298E4E0)
<<<PERL: swig_data_get
sent :SCALAR(0x12b204d0) len=10 '1234567890'
recieved:SCALAR(0x12bc71c0) len=0 ''
那麼,爲什麼它看起來像Perl的調用sv_setpvn失敗或不工作? 我不知道爲什麼當我在perl中打印返回的二進制數據時,它顯示爲空標量,但在SWIG C++嵌入式類型圖中看起來很好。
我使用:
的Perl v5.8.8爲x86_64的Linux的線程多
痛飲內置2.0.1
gcc版本4.1.1 20070105(紅帽4.1.1 -52)
得到binary_data '1234567890'[10](0x186BC4E0) 用途:傑韋利::皮克::轉儲(SV,LIM = 4)在./Test_swig_binary.t管線20 –
user297500
@ user297500,這是因爲如果沒有在全部退還。這怎麼可能?!如果你上傳了一個tarball,我會試試看。 – ikegami
'$ result = obj; // HACK:SWIG您支持這麼做,或者至少是文檔IT //這是swig生成的perl正常工作所必需的。 argvi ++;'//現在有效,謝謝你的幫助。添加「argvi ++;」 「$ result = obj」之後的語句糾正了問題。我注意到用SWIG創建的所有其他getter方法都將此語句放在包裝cxx代碼中。 – user297500