ファイル内のnullバイトが有効な値になる可能性がある場合、ファイル内の最後のバイトをnullにすることはできないことをご存知ですか。その場合、逆方向に繰り返して最初のnull以外のエントリを探すのがおそらく最善です。そうでない場合は、ファイルの実際の終わりがどこにあるかを知る方法はありません。
2バイトより長いnullバイトのシーケンス(または同様の制約)がないなど、データ形式について詳しく知っている場合。そうすれば、実際に「遷移点」の二分探索を行うことができるかもしれません。これは、線形検索よりもはるかに高速であるはずです(ファイル全体を読み取ることができると仮定します)。
基本的な考え方(連続するヌルバイトがないという以前の仮定を使用)は、次のようになります。
var data = (byte array of file data...);
var index = data.length / 2;
var jmpsize = data.length/2;
while(true)
{
jmpsize /= 2;//integer division
if( jmpsize == 0) break;
byte b1 = data[index];
byte b2 = data[index + 1];
if(b1 == 0 && b2 == 0) //too close to the end, go left
index -=jmpsize;
else
index += jmpsize;
}
if(index == data.length - 1) return data.length;
byte b1 = data[index];
byte b2 = data[index + 1];
if(b2 == 0)
{
if(b1 == 0) return index;
else return index + 1;
}
else return index + 2;