From: Shyouhei Urabe Date: 2011-05-21T08:26:15+09:00 Subject: [ruby-core:36361] [Backport87 - Backport #3297][Feedback] [patch] Array#pack("i_") is broken in big endian 64bit systems Issue #3297 has been updated by Shyouhei Urabe. Status changed from Open to Feedback Sorry for this late reply, does this still happen? I guess it has already been fixed for a while. ---------------------------------------- Backport #3297: [patch] Array#pack("i_") is broken in big endian 64bit systems http://redmine.ruby-lang.org/issues/3297 Author: Klaus K��mpf Status: Feedback Priority: Normal Assignee: Category: core Target version: ruby -v: ruby 1.8.7 (2008-08-11 patchlevel 72) [powerpc64-linux] =begin See also http://redmine.ruby-lang.org/issues/show/1131 for a similar issue (String#unpack("V")) Array#pack("i_") is broken in big endian 64 bit systems irb> [1].pack("i_") => "\000\000\000\000" The root cause is similar to the one of issue 1131, use of a wrong offset in a 64bit long. But the fix is a bit simpler and is probably correct for all other architectures too. According to the documentation, the "i" format of pack/unpack uses a fixed-size (32bit) integer, while adding "_" uses the system-size. However, the implementation of Array#pack uses a 'long' type (64bit !) to store an intermediate value, thus breaking OFF() in accessing the wrong 4 bytes of the value. Fix: Use 'int' to store the intermediate value (use of int is correct for the fixed-size as well as the system-size case) and don't use OFF() With this patch, the pack_spec and unpack_spec tests of rubyspec.org run without issues. =end -- http://redmine.ruby-lang.org