可以在php中打包带有位字段的c结构吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可以在php中打包带有位字段的c结构吗?相关的知识,希望对你有一定的参考价值。

大家好我有这个C结构,我想知道是否有可能将它包装在php fpr写入二进制文件:

C中的结构是:

struct Date
{
  unsigned spare : 6;
  unsigned day : 6;
  unsigned month : 4;
  unsigned year : 16
};

我读了perl文件,php复制实现二进制包,看看你可以打包结构但没有结构的示例和位域

在PHP中生成的任何想法?

答案

我通过向php添加自定义扩展来解决它:

PHP_FUNCTION(custom_pack)
{
    long ts;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &ts ) == FAILURE) {
        RETURN_NULL();
    }

 time_t t = ts;

   struct tm tm = *localtime(&t);

   struct MariaDBColmunStoreDateTime the_date;
   the_date.msecond = 000000;
   the_date.second = tm.tm_sec ;
   the_date.minute = tm.tm_min;
   the_date.hour = tm.tm_hour;
   the_date.day = tm.tm_mday;
   the_date.month = tm.tm_mon + 1;
   the_date.year =  tm.tm_year + 1900;


   char str[16];

   sprintf(str,"%016llx",the_date);

   strcpy(str, str_reverse_in_place(str,16));                

    RETURN_STRING(str, 1);

}

以上是关于可以在php中打包带有位字段的c结构吗?的主要内容,如果未能解决你的问题,请参考以下文章

C/C++:强制位域顺序和对齐

需要示例代码片段帮助

澄清 C 中的位域排序语义

使用位域时以字节为单位的位排序

“错误:分配给带有数组类型错误的表达式”当我分配结构字段时(C)

C++ - 使用带有结构的 GTest 值参数化测试会导致 valgrind 错误