需要将Perl解包转换为Inline :: C AV *

时间:2012-01-12 00:28:51

标签: perl inline-c

我正在努力将Perl unpack转换为Inline :: C

@array = unpack("C*", $buf);

这是我到目前为止所做的,但我是Inline :: C新手所以我无法做下一步该做什么:

STRLEN len;
char* test = SvPVbyte(buf, len);
...
AV* arr = SvRV(?);

任何人都可以提供如何做到这一点的提示吗?

2 个答案:

答案 0 :(得分:3)

这里的聪明之处可能是避免调用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);
}

或者,当然,如果您不需要它,只需编写循环并省略数组:)

答案 1 :(得分:2)

该函数的主体可能如下所示:

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.
}