Более простой способ распаковать данные файла .blend с помощью php? - PullRequest
4 голосов
/ 20 января 2012

В настоящее время я хочу прочитать некоторые данные (метаданные, имена сцен, количество ячеек, количество вершин ...) из файла .blend с функцией PHP * unpack(), ссылающейся на документацию Blender SDNA:

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

Есть ли какое-то простое решение для чтения всей этой информации с некоторыми существующими классами или библиотеками, или мне нужно читать блок за блоком из файла и писать свои собственные функции / clas / library (чтобы я мог создать что-то вроде объекта)?

1 Ответ

2 голосов
/ 20 января 2012

После консультации с руководством по php я могу сказать вам, что php просто не предоставляет способ чтения бинарных файлов, но я думаю, что есть довольно хороший способ сделать это (вдохновленный c и 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();
            ...
        }
    }
}

Если у вас есть какие-либо улучшения или советы, просто оставьте их в комментарии, я буду рад расширить ответ.

...