PACK_IS_LITTLE_ENDIAN = "\x01\00".unpack('S')[0] == 0x01 def assert_pack tmpl, packed, unpacked t = tmpl.inspect assert "assert_pack" do assert_equal packed, unpacked.pack(tmpl), "#{unpacked.inspect}.pack(#{t})" assert_equal unpacked, packed.unpack(tmpl), "#{packed.inspect}.unpack(#{t})" end end # pack & unpack 'm' (base64) assert('pack("m")') do assert_pack "m", "", [""] assert_pack "m", "AA==\n", ["\0"] assert_pack "m", "AAA=\n", ["\0\0"] assert_pack "m", "AAAA\n", ["\0\0\0"] assert_pack "m", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJT\nVFVWV1hZWg==\n", ["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"] ary = ["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"] assert_equal ary, "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJT\nVFVWV1hZWg==\n".unpack("m") assert_equal ary, "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWg==\n".unpack("m") assert_equal "QQ==\n", ["A", "B"].pack("m50") assert_equal ["A"], "QQ==\n".unpack("m50") assert_equal "QQ==Qg==", ["A", "B"].pack("m0 m0") assert_equal ["A", "B"], "QQ==Qg==".unpack("m10 m10") assert_pack "m0", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWg==", ["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"] end # pack & unpack 'M' (Quoted-printable) assert('pack("M")') do assert_pack "M", "123=\n", ["123"] assert_pack "M", "=3D\n", ["=\n"] assert_pack "M", "=E3=81=82=\n", ["あ"] assert_equal ["123"], "123=\n".unpack("M") assert_equal ["=\n"], "=3D\n".unpack("M") assert_equal ["あ"], "=E3=81=82=\n".unpack("M") end # pack & unpack 'u' (UU-encode) assert('pack("u")') do # Basic string test with known good values assert_pack "u", "-2&5L;&\\L(%=O