你如何将 Rust 中的整数转换为 C 中的 char*

我有以下用例。C 中的结构体如下所示:


typedef struct _zend_internal_arg_info {

    const char *name;

    zend_type type;

    zend_uchar pass_by_reference;

    zend_bool is_variadic;

} zend_internal_arg_info;

通常该name字段包含一个函数名称。但是由于内部实现,这个字段也可以携带一个整数。在 C 端有一个宏在做这样的转换:


(const char*)(unsigned long int)(1)

我想要做的是在 Rust 端做同样的转换。我最终得到了以下代码:


fn create_null_argument(required_args: u8, return_reference: bool) -> ZendFunctionArgument {

    let required_args_ref = Box::into_raw(Box::new(required_args as i8)) as *const i8;

    ZendFunctionArgument {

        arg: php_bindings::_zend_internal_arg_info {

            name: required_args_ref,

            type_: 0,

            pass_by_reference: if return_reference { 1 } else { 0 },

            is_variadic: 0,

        },

    }

}

这似乎适用于以下测试:


let arguments_ptr = ZendFunctionArguments::new(5, true).into_raw();

unsafe {

    let arguments: Vec<php_bindings::_zend_internal_arg_info> = Vec::from_raw_parts(arguments_ptr as *mut _, 1, 1);

    let required_args = *arguments[0].name;

    assert_eq!(5, required_args);

}

不幸的是,在 PHP 端(执行代码时),每次执行时该值都是完全随机的。我想在这里问的是,与在 C 端 ( (const char*)(unsigned long int)(1))上的转换相比,我转换 i8 的方式是否正确?


慕沐林林
浏览 273回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP