Null文字判定

masashiからメッセを受けて、ちょっと相談に乗ったんで。あまり力になれずでしたが…orz

テキストファイルをエディタで開こうとした時に、
NULL文字が含まれてるっていうメッセージが出てくるんやけど、
NULL文字は自動的に半角スペースに置き換わってしまうんよね。
(まぁエディタによってその仕様は違うと思うけど)
それで、知りたいのは、
そのNULL文字がどこにあるかを特定する方法
なんかないかいなぁ?

仕様的には、普通のテキストファイルに時々Null文字が紛れ込むといった感じみたい。ま、話聞いて漠然と感じただけなんで、裏づけも何もないですが。

とりあえず

  1. バイナリエディタで手軽に
  2. ちゃちゃっとバイトストリームで読むスクリプトを作る

の二つの選択肢を提案しました。*1


で、二番目の選択肢で「ちゃちゃっと」と言ったからには、自分でも「ちゃちゃっと」作れないとカッコ悪いな思ったんで、ちょい実装。

どうやってNull文字の箇所を判定するかですが、以下の手順でできるかなと。

  1. バイナリでデータを読み込む
  2. Nullのコード(0x00)を" [N] "(0x205B4E5D20)に変換する
  3. そのデータをバイナリ書き出し後、再度テキストファイルとして読み込む

というわけで、Perlのコードを。

#!/usr/bin/perl

$file = shift || 'null.txt';
open IN, "< $file";

while (<IN>) {
  $str = unpack("H*", $_);
  $str =~ s/00/205B4E5D20/g;             # 0x(205B4E5D20) -> ' [N] '
  print unpack("a*", pack("H*", $str));
}

close IN;


スクリプト作成時間は、技術検証なども含めて1:43。残念ながら、これでは「ちゃちゃっと」とは言いがたいレベルです。

ま、今回はバイナリ読み込みよりも、むしろ思い通りのバイナリデータを作り込む方に時間を取られたのですがね…

*1:結局、バイナリエディタで読み込む方法を採用したみたい