php - 用 PHP 解压缩 Tiled TMX 文件内容

标签 php xml gzip base64

我在从 .tmx(平铺)文件中提取图层内容时遇到问题。 我想用 PHP 获取完整的未压缩 数据并制作它的小图像。 获取标题信息(如宽度、高度等)没有问题 - SimpleXML 在那里完成它的工作。但不知何故解压瓦片层不起作用。

数据本身存储为 base64 和 gzip 编码的字符串(例如 H4sIAAAAAAAAC+3bORKAIBQEUVzuf2YTTSwEA/gL00EnJvJQsAjcSyk7EU3v+Jn3OI)但我什至在获取 base64 解码代码时遇到问题(它只是让我感到奇怪字符,当我重新打开平铺 map 并将其保存为“未压缩的 base64”时,结果只是一个空字符串 - 当然不使用 gzip 解压缩)。

我已经通过网络搜索并看到了数据是如何被精确压缩的(Github article)。似乎我必须使用 gzinflate() 命令而不是所有其他命令(例如 gzuncompress),但这对我也不起作用。

我现在的代码如下:

<?php
  // Get the raw xml data
  $map_xml = new SimpleXML(file_get_contents("map.tmx"));
  $data = $map_xml["layer"][0]["data"]["@content"]; // I would make a loop here
  $content =gzinflate(base64_decode($map_content)); // gives me and error

  var_dump($data); // results in nothing
?>

经过更多研究后,我发现我应该使用 zlib 过滤器 ( php.net article )。 现在我真的很困惑我不知道我应该选择什么 - 我再次询问谷歌并得到以下信息:Compressing with Java Decompressing with PHP .根据答案,我必须在使用 base64 和 gzip 方法之前裁剪标题。

现在我的问题是:我必须先剪掉标题吗?如果是,我该怎么做? 如果没有,那我怎样才能得到未压缩的数据呢?

我真的希望有人能在这里帮助我!

最佳答案

如前所述,Php 的 gzinflate 和 gzuncompress 命名不正确。但是,我们可以利用接受原始压缩数据的 gzinflate。 gzip header 有 10 个字节长,可以使用 substr 去除。使用上面的示例,我尝试了这个:

$base64content = "H4sIAAAAAAAAC+3bORKAIBQEUVzuf2YTTSwEA/gL00EnJvJQsAjcSyk7EU3v+Jn3OI";
$compressed = substr( base64_decode($base64content), 10);
$content = gzinflate($compressed);

这会为您提供一个表示原始数据的字符串。您的 TMX 层主要由 gid 0、2 和 3 组成,因此如果您将其打印出来,您只会看到空白。要获得有用的数据,您需要对字符调用 ord:

$chars = str_split($content);
$values = array();
foreach($chars as $char) {
    $values[] = ord($char);
}
var_dump( implode(',', $values) );  // This gives you the equivalent of saving your TMX file with tile data stored as csv

希望对您有所帮助。

关于php - 用 PHP 解压缩 Tiled TMX 文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10613996/

相关文章:

xml - XSD 对特定类型的兄弟元素的属性的唯一约束

javascript - 需要推荐 Node.js Gzip 静态资源

php - 访问css文件laravel中的 session 变量

php - Laravel:找不到类 'GuzzleHttp\Client'

php - PHP 和 Servlet 的主要区别

java - Android-怪九补丁暗影

PHP simpleXML如何以格式化的方式保存文件?

java - 使用XmlAdapter在JAXB生成的类中使用java.util.Locale

python - PIL : image from url, 无法识别镜像文件

c++ - 是否有可用于 GZIP 的测试 vector ?