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

需要将Perl解包转换为内联::C AV*,perl,inline-c,Perl,Inline C,我正在努力将Perl解包转换为内联::C @array = unpack("C*", $buf); 这就是我目前所拥有的,但我是一名内联::C新手,因此我很难下一步做什么: STRLEN len; char* test = SvPVbyte(buf, len); ... AV* arr = SvRV(?); 有人能提供一个如何做这件事的提示吗?这里最明智的做法可能是避免调用unpack,而做unpack会做的事情,这更简单 STRLEN len; char *str = SvPVbyte(b

我正在努力将Perl
解包转换为内联::C

@array = unpack("C*", $buf);
这就是我目前所拥有的,但我是一名内联::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);
}
strlenlen;
char*str=SvPVbyte(buf,len);
AV*arr=newAV();
char*ptr;
对于(ptr=str;ptr

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

函数体可以如下所示:

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