PHP使用C语言开发扩展中:zend_parse_parameters方法接收二进制数据时取不到数据?

发布于 2022-09-04 00:58:56 字数 801 浏览 17 评论 0

PHP扩展开发中,有一个方法需要接收二进制数据,zend_parse_parameters设置参数类型为 "s",打印参数的时候为空,看样子是没有接收到。

PHP_FUNCTION(hau_socket)
{
    char *buf;
    int len;


    if( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "s", &buf, &len) == FAILURE ) {
        return;
    }

    php_printf("str:%s, buf length:%d, len:%d\n", buf, strlen(buf), len); //这里的输出跟原来一样
    PHPWRITE(buf,len); //这里输出了二进制数据,看起来是乱码,但我知道是输出了数据了!
}
<?php

$packet = new SocketPacket();//使用pack函数打包进制数据
$packet->WriteBegin( 0x7070 );
$packet->WriteInt_N( 0x1001 );
$packet->WriteInt_N( 1 );
$packet->WriteInt_N(9055249);
$packet->WriteEnd_n();
hau_socket( $packet->GetPacketBuffer() );
输出结果:str:, buf length:0, len:21

是否参数类型设置不对!?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

信仰 2022-09-11 00:58:56

php_printf那一行是不是少了个%d,最后的len没有打印出来。
然后,接收二进制数据你不应该也不能用strlen

打印参数的时候为空是正常的,因为你传入的是二进制数据(有NULL)。
还有,如果你一定要打印二进制数据,应该用PHPWRITE(buf, len)。
看这里http://php.net/manual/pl/inte...

你没皮卡萌 2022-09-11 00:58:56

zend_parse_parameters的使用上没有发现问题,并且你printf时也没有报空指针,说明buf确实被赋值了。我觉得你应该检查一下$packet->GetPacketBuffer()是否返回了一个字符串。

〆一缕阳光ご 2022-09-11 00:58:56

你先在php里

var_dump ($packet->GetPacketBuffer());

输出一下他的值吧,扩展部分没毛病。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文