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

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

于 2010-08-28T13:28:04.423 回答