'*' parameter in pack format 'M', 'm', or 'P' acts oddly

Yuguiです。

Array#packにおいて、"M"や"m"は出力の1行の長さを、
"P"は対応する文字列(バイト列)の長さを表します。

にもかかわらず、"M*"ã‚„“m*”, "P*"を指定するとアスタリスクが他のフォーマッ
ãƒˆã«ãŠã‘ã‚‹å ´åˆåŒã˜ãä½™ã£ã¦ã„ã‚‹é…åˆ—è¦ç´ ã®å€‹æ•°ã«å±•é–‹ã•ã‚Œã¾ã™ã€‚

結果として、何だか妙な挙動になります。
["abc"5, “d”, “e”, “f”].pack('m’)
#=> “YWJj\nYWJj\nYWJj\nYWJj\nYWJj\n”
["abc"5, “d”, “e”, “f”, “g”, “h”].pack('m’)
#=> “YWJjYWJj\nYWJjYWJj\nYWJj\n”

[“a”].pack(“P*”) #=> “\220\a9\001”
[“a”, “b”].pack(“P*”) #=> ArgumentError: too short buffer for P(1 for 2)

この3つのフォーマットではアスタリスクは単に無視するのが良いのではないか
と思いまして、添付のような修正を書いてみました。いかがでしょう?

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:37289] ‘*’ parameter in pack format ‘M’, ‘m’,
or ‘P’ acts oddly”
on Sat, 6 Dec 2008 21:29:36 +0900, “Yugui (Yuki S.)”
[email protected] writes:

|Yuguie$B$G$9!#e(B
|
|Array#packe$B$K$$$$F!"e(B"M"e$B$de(B"m"e$B$O=PNO$Ne(B1e$B9T$ND9$5$r!"e(B
|"P"e$B$OBP1~$9$kJ8;zNse(B(e$B%P%$%HNse(B)e$B$ND9$5$rI=$7$^$9!#e(B
|
|e$B$K$b$+$+$o$i$:!"e(B"M
"e$B$de(B"m*“, “P*“e$B$r;XDj$9$k$H%”%9%?%j%9%/$,B>$N%U%)!<%^%Ce(B
|e$B%H$K$$1$k>l9gF1$8$/M>$C$F$$$kG[NsMWAG$N8D?t$KE83+$5$l$^$9!#e(B
|
|e$B7k2L$H$7$F!"2?$@$+L/$J5sF0$K$J$j$^$9!#e(B
|["abc"5, “d”, “e”, “f”].pack('m’)
| #=> “YWJj\nYWJj\nYWJj\nYWJj\nYWJj\n”
|["abc"5, “d”, “e”, “f”, “g”, “h”].pack('m’)
| #=> “YWJjYWJj\nYWJjYWJj\nYWJj\n”
|
|[“a”].pack("P
”) #=> “\220\a9\001”
|[“a”, “b”].pack(“P*”) #=> ArgumentError: too short buffer for P(1 for 2)
|
|e$B$3$Ne(B3e$B$D$N%U%)!<%^%C%H$G$O%”%9%?%j%9%/$OC1$KL5;k$9$k$N$,NI$$$N$G$O$J$$$+e(B
|e$B$H;W$$$^$7$F!"E:IU$N$h$&$J=$@5$r=q$$$F$_$^$7$?!#$$$+$,$G$7$g$&e(B?

e$B$$$$$s$8$c$J$$$G$7$g$&$+!#%3%_%C%H$7$F$/$@$5$$!#e(B