У меня есть бизнес-требование прочитать целочисленные значения со знаком с длиной байтов от 1 до 8.
Стандартная реализация значений int занимает байты порядка 2 ** n
> perl -e ' $x=chr(253); $y=unpack "c",$x; printf("%d\n",$y) ' # 1 byte
-3
> perl -e ' $x=chr(255).chr(253); $y=unpack "s>",$x; printf("%d\n",$y)' # 2 byte
-3
> perl -e ' $x=chr(255) x 3;$x.=chr(253); $y=unpack "i>",$x; printf("%d\n",$y) ' # 4 byte
-3
> perl -e ' $x=chr(255) x 7;$x.=chr(253); $y=unpack "q>",$x; printf("%d\n",$y) ' # 8 byte
-3
>
Для 3, 5, 6, 7 байтов я пытаюсь как показано ниже
> perl -e ' $x=chr(255) x 2;$x.=chr(253); $y=unpack "i>",$x; printf("%d\n",$y) '
0
>
Но это неправильно, мне нужно -3.
Эта ссылка Декодирование3-байтовое целое число в Perl отвечает за числа без знака, но не решает мою проблему.
Может ли кто-нибудь помочь получить значения со знаком для 3, 5, 6, 7 байтов?