在PHP中确定二进制数据的未知数据格式

时间:2010-08-28 03:01:24

标签: php unpack

我有混合了uint32和null终止字符串的二进制数据。我知道单个数据集的大小(每组数据共享相同的格式),但不是实际的格式。

我一直在使用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,是否有更简单的方法去做这个?

感谢。

1 个答案:

答案 0 :(得分:1)

我认为你的approcah没问题。 好吧,如果你只得到ascii字符串它很容易,因为最高位总是0或1(在一些奇怪的情况下...)分析文件中的一些字节,然后查看分布将告诉你可能是ascii或其他东西二进制文件。 如果你有一个不同的编码,如utf8或其他东西真的很痛苦的屁股。 你可以概率地寻找反复出现的CR / LF字符或过滤掉0-31的raing,只让tab,cr,lf,ff slip trhough。当你分析前X个字节并比较非tab,cr,lf,ff chars和其他的比例时。这将适用于任何编码,因为ascii范围是标准的...... 定义实际的文件类型,最好让它到os层,只需从shell调用文件或使用php函数获取mimetype ......