我正在努力将 Perl 转换unpack
为 Inline::C
@array = unpack("C*", $buf);
到目前为止,这是我所拥有的,但我是 Inline::C 新手,所以我不知道下一步该做什么:
STRLEN len;
char* test = SvPVbyte(buf, len);
...
AV* arr = SvRV(?);
任何人都可以提供如何做到这一点的提示吗?
这里的聪明之处可能是避免调用unpack
,并做unpack
会做的事情,这更简单。
STRLEN len;
char *str = SvPVbyte(buf, len);
AV *arr = newAV();
char *ptr;
for (ptr = str; ptr < str + len ; ptr++) {
SV *char_value = newSViv(*ptr);
av_push(arr, char_value);
}
或者,当然,如果不需要它,只需编写循环并省略数组:)
函数的主体可能如下所示:
STRLEN len;
char* buf;
AV* av = newAV();
SvGETMAGIC(sv);
buf = SvPVbyte(sv, len);
while (len--)
av_push(av, newSViv(*(buf++)));
对于返回值,您有两种选择。
SV* my_unpack(SV* sv) {
...
return newRV_noinc(av); // Will get mortalized by typemap.
}
或者
AV* my_unpack(SV* sv) {
...
return sv_2mortal(av); // Typemap will create a reference.
}