Perl과 C++ 라이브러리간에 바이너리 데이터를 쉽게 옮길 수 있도록 노력하고 있습니다. 나는 다음과 같은이 내 꿀꺽 꿀꺽 인터페이스 파일에서SWIG를 사용하여 Perl로 이진 데이터 이동/
struct binary_data {
unsigned long length;
unsigned char *data;
};
:
은 내가 binary_data을 손에는 C++의 구조체를 생성%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;
}
내 펄 모듈을 구축위한 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++와 펄의 printf 표준 출력은 다음과 같습니다
>>>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 ''
그래서 왜 실패하거나 작동하지 않는 sv_setpvn 에 펄 호출 생겼는데? 반환 된 이진 데이터를 perl로 출력 할 때 왜 빈 스칼라로 표시되는지 알 수는 없지만 SWIG C++의 포함 된 typemap 내에서 제대로 표시됩니다.
내가 사용하고 있습니다 :
x86_64에-리눅스 스레드 멀티꿀꺽 꿀꺽 위해 만들어진
펄 v5.8.8 2.0.1
GCC 버전 4.1.1 20070105 (레드햇 4.1.1 -52) 펄 측면에서
얻을 binary_data '1234567890'[10] (0x186BC4E0) 사용법 : (STABLE) : 픽 :: 덤프 (SV, LIM = 4) ./Test_swig_binary.t 라인 (20) –
user297500
user297500 @에, 그건 아무것도에서 마치 모두 반환됩니다. 그게 어떻게 가능하니?! 어딘가에서 tarball을 업로드했다면 시도해 보겠습니다. – ikegami
'$ result = obj; // 해킹 :이 작업을 지원하거나 최소 문서 번호 // 생성 된 펄이 올바르게 작동하려면이 작업이 필요합니다. argvi ++;'// 이제 도움이됩니다. "argvi ++"추가하기 문 "$ 결과 = obj"후 문제를 해결했습니다. SWIG로 작성된 다른 모든 getter 메소드가 래퍼 cxx 코드에이 문장을 넣었습니다. – user297500