From: arton Date: 2003-12-26T00:36:20+09:00 Subject: [ruby-dev:22427] Array#pack('I') cause exception while msb is on Subjectはブロークンですが、 Array.pack('I')または('i')で、1.8.1ではMSBが立っていると例外になります。 D:\home\arton\ruby-1.8.1>ruby -v -e "p [0x80000000].pack('I')" ruby 1.8.0 (2003-08-04) [i386-mswin32] "\000\000\000\200" D:\home\arton\ruby-1.8.1>ruby -v -e "p [0x80000000].pack('I')" ruby 1.8.1 (2003-12-25) [i386-mswin32] -e:1:in `pack': bignum too big to convert into `int' (RangeError) from -e:1 D:\home\arton\ruby-1.8.1>ruby -v -e "p [0x80000000].pack('L')" ruby 1.8.1 (2003-12-25) [i386-mswin32] "\000\000\000\200" http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=pack%A5%C6%A 5%F3%A5%D7%A5%EC%A1%BC%A5%C8%CA%B8%BB%FA%CE%F3 を見ると32ビット値はLまたはlを使用しろという意図にも取れるので1.8.1から はこうなったというだけなのかも知れませんが、できればこれまでの動作のほう が嬉しいです。 D:\home\arton\ruby-1.8.1>diff -u -p pack.c.org pack.c diff: conflicting specifications of output style *** pack.c.org Fri Dec 26 00:19:48 2003 --- pack.c Fri Dec 26 00:20:04 2003 *************** pack_pack(ary, fmt) *** 726,732 **** from = NEXTFROM; if (NIL_P(from)) i = 0; else { ! i = NATINT_I32(from); } rb_str_buf_cat(res, OFF32(&i), NATINT_LEN(int,4)); } --- 726,732 ---- from = NEXTFROM; if (NIL_P(from)) i = 0; else { ! i = NATINT_U32(from); } rb_str_buf_cat(res, OFF32(&i), NATINT_LEN(int,4)); } -- arton __________________________________________________ Do You Yahoo!? Yahoo! BB is Broadband by Yahoo! http://bb.yahoo.co.jp/