用 php 解压 .blend 文件数据的更简单方法?

Posted

技术标签:

【中文标题】用 php 解压 .blend 文件数据的更简单方法?【英文标题】:Easier way to unpack data of a .blend file with php? 【发布时间】:2012-01-20 13:31:04 【问题描述】:

目前我想使用 phpunpack() 函数从 .blend 文件中读取一些数据(元数据、场景名称、网格数、顶点数...),参考 Blender SDNA 文档:

http://www.atmind.nl/blender/blender-sdna-256.html

是否有一些简单的解决方案可以使用一些现有的类或库来读取所有这些信息,或者我必须从文件中逐块读取并编写我自己的函数/类/库(这样我就可以创建类似对象的东西) ?

【问题讨论】:

恐怕你会。我会尝试为您检查一些东西,但我持怀疑态度而不是积极态度。 好像什么都没有,你自己写吧:( 如果你能做到这一点,你可以分享课程! 谢谢。我将很快开始使用服务器端 / php 版本以及仅用于 blender / .blend 和 x3d 的 javascript 版本 【参考方案1】:

在咨询了 php 手册后,我可以告诉你 php 只是不提供读取二进制文件的方法,但我认为有很好的方法来做到这一点(受 c and fread 启发)

class BinaryReader 
    const FLOAT_SIZE = 4;

    protected $fp = null; // file pointer
    ...

    public function readFloat() 
         $data = fread( $fp, self::FLOAT_SIZE);
         $array = unpack( 'f', $data);
         return $array[0];
    

     // Reading unsigned short int
     public function readUint16( $endian = null)
          if( $endian === null)
               $endian = $this->getDefaultEndian();
          

          // Assuming _fread handles EOF and similar things
          $data = $this->_fread( 2);
          $array = unapack( ($endian == BIG_ENDIAN ? 'n' : 'v'), $data);
          return $array[0];
     

    // ... All other binary type functions

    // You may also write it more general:
    public function readByReference( &$variable)
        switch( get_type( $variable))
            case 'double':
                return $this->readDouble();
            ...
        
    

如果您有任何改进或提示,请在评论中发布,我将很高兴扩展答案。

【讨论】:

fread 和 file_get_contents 读取二进制文件,我知道吗?也是它的字节序而不是浮动 =) @DanielRuf file_get_contents 也应该是二进制安全的,但是当您打开 2,5,20,... MB 大型模型并且您只需要解析某些标头时,您会想要这样做喜欢:read number of chunks; go to first chunk; get its size; get count of mashes; skip it and read next chunk; 而不是加载整个文件。我不明白评论的第二部分,你对字节序有问题吗? 模型不是那么大 =) 这也取决于我知道的服务器设置和服务器硬件,这也是你可以用 fread 做的事情,你的脚本中有 double 和 float 但那不是字节序, 小端和大端的 unpack 语句是 other @DanielRuf 我对这个很感兴趣。我已经添加了readUint16 方法,所以它会是我所想的干净(这包括处理不同的字节序示例)。我知道这个示例至少缺少 32 位和 64 位类型的功能、字符和对双精度/浮点数的正确处理。但这只是作为如何解决您的问题的示例。我相信确实如此。如果它没有给我一个例子,你需要做什么你不能用这种方法。 我想你误解了搅拌机 sdna 整个文件是字节序的,所以它是 unpack(v 或 V)我的意思是一种直接从文件创建对象的方法(但有不同的块,数据与不同的大小和长度...)

以上是关于用 php 解压 .blend 文件数据的更简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 动态创建 Javascript 的更简单方法

零元学Expression Blend 4 - Chapter 23 Deep Zoom Composer与Deep Zoom功能

数据挖掘竞赛利器-Stacking和Blending方式

我的vs blend 没有导入psd文件的选项,知道怎么解决吗

突破PHP免费空间文件格式上传限制-FTP传zip,PHP解压zip文件 - 比单文件管理器更好用

突破PHP免费空间文件格式上传限制-FTP传zip,PHP解压zip文件 - 比单文件管理器更好用