3

unpackPerlをInline::Cに変換するのに少し苦労しています

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

これは私がこれまでに持っているものですが、私はInline :: Cの初心者なので、次に何をすべきか問題があります。

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

誰かがこれを行う方法のヒントを提供できますか?

4

2 に答える 2

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);
}

または、もちろん、ループを記述して、必要がない場合は配列を省略します:)

于 2012-01-12T02:14:39.403 に答える
2

関数の本体は次のようになります。

STRLEN len;
char*  buf;
AV*    av = newAV();

SvGETMAGIC(sv);
buf = SvPVbyte(sv, len);
while (len--)
    av_push(av, newSViv(*(buf++)));

戻り値には2つの選択肢があります。

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.
}
于 2012-01-12T02:38:43.417 に答える