0

uint32 とヌルで終了する文字列が混在するバイナリ データがあります。個々のデータ セットのサイズは知っていますが (各データ セットは同じ形式を共有しています)、実際の形式はわかりません。

unpack を使用して、次の関数でデータを読み取りました。

function read_uint32( $fh ){
  $return_value = fread($fh, 4 );
  $return_value = unpack( 'L', $return_value );
  return $return_value[1];
}

function read_string( $fh ){
  do{
    $char = fread( $fh, 1 );
    $return_string .= $char;
  }while( ord( $char ) != 0 );
  return substr($return_string, 0, -1);
}

次に、基本的に両方の関数を試して、データが文字列として意味があるかどうかを確認します。そうでない場合は、おそらく int です。これを行う簡単な方法はありますか?

ありがとう。

4

1 に答える 1

1

さて、あなたのapprocahは大丈夫だと思います。アスキー文字列のみを取得する場合、最高ビットは常に0または1になるため(奇妙な場合は...)、ファイルからいくつかのバイトを分析してから分布を見ると、おそらくアスキーか何かかがわかります。バイナリ。utf8のような別のエンコーディングを使用している場合、それは本当にお尻の痛みです。おそらく、繰り返し発生するCR / LF文字を探すか、0〜31の範囲を除外して、tab、cr、lf、ffのみを通過させることができます。最初のXバイトを分析し、非タブ、cr、lf、ff文字などの比率を比較する場合。これは、ASCII範囲が標準化されているため、どのエンコーディングでも機能します...実際のファイルタイプを定義するには、これをosレイヤーに送信し、シェルからファイルを呼び出すか、php関数を使用してmimetypeを取得するのがおそらく最善です...

于 2010-08-28T13:28:04.423 に答える