青木です。

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;