From: Minero Aoki Date: 2003-12-23T22:51:17+09:00 Subject: [ruby-dev:22344] pack('N') broken on 64bit platforms 青木です。 64 ビットプラットフォーム上だと pack("N") の返り値が 常に "\000\000\000\000" になります。 aamine@asv800 % cat t def f(n) p [n].pack('N') end f 1 f 2 f 3 f 10 f 100 aamine@asv800 % ruby -v t ruby 1.8.1 (2003-12-22) [alpha-netbsd] "\000\000\000\000" "\000\000\000\000" "\000\000\000\000" "\000\000\000\000" "\000\000\000\000" とりあえず以下のように修正して直るのを確認しましたが、 どうするのがよいでしょう。 ------------------------------------------------------------------- 青木峰郎 Index: pack.c =================================================================== RCS file: /ruby/ruby/pack.c,v retrieving revision 1.60 diff -u -p -r1.60 pack.c --- pack.c 18 Dec 2003 21:08:25 -0000 1.60 +++ pack.c 23 Dec 2003 13:22:09 -0000 @@ -782,6 +782,7 @@ pack_pack(ary, fmt) case 'N': /* unsigned long (network byte-order) */ while (len-- > 0) { unsigned long l; + char buf[8]; from = NEXTFROM; if (NIL_P(from)) l = 0; @@ -789,7 +790,11 @@ pack_pack(ary, fmt) l = NATINT_U32(from); } l = NATINT_HTONL(l); - rb_str_buf_cat(res, OFF32B(&l), NATINT_LEN(long,4)); + buf[0] = (char)((l & (0xff << 0)) >> 0); + buf[1] = (char)((l & (0xff << 8)) >> 8); + buf[2] = (char)((l & (0xff << 16)) >> 16); + buf[3] = (char)((l & (0xff << 24)) >> 24); + rb_str_buf_cat(res, buf, 4); } break;