umq (4421) の日記

○ ◎ ●

バイト列に意味はあるのか(04)

umq による 2004年09月14日 21時03分 の日記 (#250488)

GNU binutils の strings(1) については,以前触れたが,今回はencoding オプションの実装について,追いかけてみる。

手許にある strings 2.15 のマニュアルの記述によると
-e encoding
--encoding=encoding

Select the character encoding of the strings that are to be found.
Possible values for encoding are: s = single-7-bit-byte characters
(ASCII, ISO 8859, etc., default), S = single-8-bit-byte characters,
b = 16-bit bigendian, l = 16-bit littleendian, B = 32-bit bigen-
dian, L = 32-bit littleendian. Useful for finding wide character
strings.

とある。

この,encoding として指定できる s, S, b, l, B, l の各オプションを指定するとどうなるか,コードを追いかけてみた。

s オプション指定時は,指定なしと同じで,以前調べた通り,``printable'' な文字のみが取出される。

S オプションを指定したときは,s オプションで ``printable'' とされたものに加え,バイト値が 128 以上(255以下)のものも ``printable'' として扱う。
これはいささか乱暴で,\x80-\x9f (の一部)を制御文字として扱う表示環境などで,問題となる可能性もある。

b, l, B, L を選択した場合は,b, l については 2バイトずつ,B, L については 4バイトずつ順に取出して変数 c に格納する。バイトのずれは考慮しない。l, L については,c に入れる際にバイト順を逆順にする。こうして得られた c の値(2バイト分,もしくは4バイト分をかたまりとしてみたもの)を文字コード値として,他のオプションでバイト値に対して行なっているのと同じように ``printable'' な文字であるかの判別に用いる。
つまり,b, l, B, L を対象とした場合,\x00 で埋められることを考慮する他は,対象となる文字列の取出し方に違いはない。

因みに,``printable'' であるかどうかを判別するマクロ STRING_ISGRAPHIC() は,以下のように定義されている
#define STRING_ISGRAPHIC(c) \
   ( (c) >= 0 \
    && (c) <= 255 \
    && ((c) == '\t' || ISPRINT (c) || (encoding == 'S' && (c) > 127)))

補足:
言い換えると,b, l, B, l の各オプションは,それぞれ,UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE に対応するが,strings(1) で表示できるのは U+0009, U+0020U+007E のみである。

参考

[ひとつまえ]

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

アレゲはアレゲ以上のなにものでもなさげ -- アレゲ研究家

処理中...