2017-01-19 6 views
3

私はCの関数を持っている:charをlibc :: c_charに変換するには?

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_charを期待しています。 charを送信しますが、c_chari8であり、charではありません。この場合、Rust chari8またはc_charに変換するにはどうすればよいですか?

答えて

9

あなたは質問をされています

私は8ビットの値に32ビットの数に合わせてどうすればよいですか?

  • 残っている:あなたが停止し、質問をさせなければならないしかし

    let c = rust_character as libc::c_char; 
    

    、「ビットのほとんどを捨てる」:即時の答えを持っている

右のエンコーディングのビット?

  • 私が捨てたものはどうですか?
  • ルストcharすべてのUnicodeスカラ値をエンコードできます。 このコードのためのあなたの希望の行動は何ですか:

    let c = '' as libc::c_char; 
    

    それは価値-87、非ASCII値を作成することはおそらくありません! -17であるか、このあまり愚かそしておそらく、より現実的な変種、:Cコードは、文字によってどういう意味:

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

    その後、聞いていますか? 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タイプを返すことができます。

    私の代わりにcharc_charを受け取るために私の機能(グルー関数を呼び出します1)を変更する必要がありますか?

    それは問題をスタックの上にさらに押し上げるかもしれません。 every発信者はc_charの作成方法を決定し、128〜255の値を心配しなければなりません。コードの意味がASCII文字でなければならない場合、はあなたのタイプでコード化します。具体的には、ascii crateのようなものを使用できます。

    いずれの場合でも、失敗の可能性を他の人のコードにプッシュすると、発信者をより不満にさせる可能性があります。

    +0

    アサートを正しく処理するにはどうすればいいですか?または、 'char'の代わりに' c_char'を受け取る関数(グルー関数を呼び出す関数)を変更する必要がありますか? – Sassa

    +2

    詳細で非常に洞察力のある答えに感謝します! – Sassa