当前位置:  开发笔记 > 后端 > 正文

如何将char转换为libc :: c_char?

如何解决《如何将char转换为libc::c_char?》经验,为你挑选了1个好方法。

我有一个C函数:

Node * first_element_by_path(const Node * node, const char * path, char delimiter);

还有一个防锈胶功能:

pub fn first_element_by_path(node: *mut CNode, path: *const c_char, delimiter: c_char) -> *mut CNode;

它期望一个c_charas分隔符.我想发送一个char,但它c_char是一个i8而不是一个char.如何将Rust转换chari8或者c_char在这种情况下?



1> Shepmaster..:

你在问这个问题:

如何将32位数字拟合为8位值?

哪个有直接答案:"丢掉大部分位":

let c = rust_character as libc::c_char;

但是,这应该让你停下来问问题:

其余位是否正确编码?

那些丢弃的东西怎么样?

Rust char允许编码所有Unicode标量值.对此代码的期望行为是什么:

let c = '' as libc::c_char;

它可能不是创建值-87,非ASCII值!或者这个不那么愚蠢,也许更现实的变体,它是-17:

let c = 'ï' as libc::c_char;

然后你必须问:C代码对一个角色意味着什么?C代码认为字符串是什么编码?C代码如何处理非ASCII文本?

最安全的事情可能是断言该值在ASCII范围内:

let c = 'ï';
let v = c as u32;
assert!(v <= 127, "Invalid C character value");
let v = v as libc::c_char;

您也可以返回一个Result表示该值超出范围的类型,而不是断言.

我应该更改我的功能(将调用胶水功能的那个)来接收c_char而不是char

那要看.这可能只是将问题进一步推向堆栈; 现在每个调用者都必须决定如何创建c_char并担心128到255之间的值.如果代码的语义是这样的,那么值必须是ASCII字符,那么在你的类型中编码.具体来说,你可以使用类似ascii crate的东西.

在任何一种情况下,你都会将失败的可能性转移到别人的代码中,这会让你的生活变得更加容易,这可能会让调用者更加沮丧.


非常感谢您提供详尽而富有洞察力的答案!
推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有