From: Koji Arai Date: 1999-06-01T02:49:43+09:00 Subject: [ruby-dev:7037] Re: Ruby 1.3.4-990531 新井です。 ruby-1.2.5も同様ですが、 p [""].pack("H1000") p [""].pack("h1000") p [""].pack("B1000") p [""].pack("b1000") がゴミを返します。 添付の(不完全な)パッチで、 "" "" "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000..." "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000..." となりますが、H/h と B/b の挙動どちらがいいのでしょ う? 最初にバグを発見した自前のスクリプトでは、前者を期 待した処理でしたが… perlは、後者のようです。 perl -le 'print pack("B32", "")' | cat -v ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ Index: pack.c =================================================================== RCS file: /home/cvs/ruby/pack.c,v retrieving revision 1.1.1.3.2.7 diff -u -r1.1.1.3.2.7 pack.c --- pack.c 1999/05/25 08:26:01 1.1.1.3.2.7 +++ pack.c 1999/05/31 17:28:51 @@ -368,16 +368,19 @@ int byte = 0; int i; - for (i=0; i++ < len; ptr++) { + for (i=0; i < len; i++) { if (*ptr & 1) byte |= 128; - if (i & 7) + if (i+1 & 7) byte >>= 1; else { char c = byte & 0xff; rb_str_cat(res, &c, 1); byte = 0; } + + if (i < plen) + ptr++; } if (len & 7) { char c; @@ -393,15 +396,17 @@ int byte = 0; int i; - for (i=0; i++ < len; ptr++) { + for (i=0; i < len; i++) { byte |= *ptr & 1; - if (i & 7) + if (i+1 & 7) byte <<= 1; else { char c = byte & 0xff; rb_str_cat(res, &c, 1); byte = 0; } + if (i < plen) + ptr++; } if (len & 7) { char c; @@ -417,13 +422,13 @@ int byte = 0; int i; - for (i=0; i++ < len; ptr++) { + for (i=0; i < len; i++) { if (ISXDIGIT(*ptr)) { if (ISALPHA(*ptr)) byte |= (((*ptr & 15) + 9) & 15) << 4; else byte |= (*ptr & 15) << 4; - if (i & 1) + if (i+1 & 1) byte >>= 4; else { char c = byte & 0xff; @@ -431,6 +436,9 @@ byte = 0; } } + + if (i < plen) + ptr++; } if (len & 1) { char c = byte & 0xff; @@ -444,13 +452,13 @@ int byte = 0; int i; - for (i=0; i++ < len; ptr++) { + for (i=0; i < len; i++) { if (ISXDIGIT(*ptr)) { if (ISALPHA(*ptr)) byte |= ((*ptr & 15) + 9) & 15; else byte |= *ptr & 15; - if (i & 1) + if (i+1 & 1) byte <<= 4; else { char c = byte & 0xff; @@ -458,6 +466,9 @@ byte = 0; } } + + if (i < plen) + ptr++; } if (len & 1) { char c = byte & 0xff;