From: "Yugui (Yuki Sonoda)" Date: 2008-12-06T21:29:36+09:00 Subject: [ruby-dev:37289] '*' parameter in pack format 'M', 'm', or 'P' acts oddly This is a multi-part message in MIME format. --------------060708090905050205030506 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit 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つのフォーマットではアスタリスクは単に無視するのが良いのではないか と思いまして、添付のような修正を書いてみました。いかがでしょう? -- Yugui http://yugui.jp 私は私をDumpする --------------060708090905050205030506 Content-Type: text/plain; x-mac-type="0"; x-mac-creator="0"; name="pack.diff" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="pack.diff" ZGlmZiAtLWdpdCBhL3BhY2suYyBiL3BhY2suYwppbmRleCA3MThmOTc3Li5iMDI0NDlhIDEw MDY0NAotLS0gYS9wYWNrLmMKKysrIGIvcGFjay5jCkBAIC00OTEsNyArNDkxLDkgQEAgcGFj a19wYWNrKFZBTFVFIGFyeSwgVkFMVUUgZm10KQogCSAgICB9CiAJfQogCWlmICgqcCA9PSAn KicpIHsJLyogc2V0IGRhdGEgbGVuZ3RoICovCi0JICAgIGxlbiA9IHN0cmNocigiQFh4dSIs IHR5cGUpID8gMCA6IGl0ZW1zOworCSAgICBsZW4gPSBzdHJjaHIoIkBYeHUiLCB0eXBlKSA/ IDAKKyAgICAgICAgICAgICAgICA6IHN0cmNocigiUE1tIiwgdHlwZSkgPyAxCisgICAgICAg ICAgICAgICAgOiBpdGVtczsKIAkgICAgcCsrOwogCX0KIAllbHNlIGlmIChJU0RJR0lUKCpw KSkgewo= --------------060708090905050205030506--