如何从 &str 转换为 [i8; 256]

How to convert from &str to [i8; 256]

我正在使用一个由 Bindgen 自动生成绑定的 c api。 Rust 包装器定义的 属性 结构之一采用 [i8, 256],它需要是一个字符串,例如“mystr”

C 声明是这样的:

    typedef struct Properties 
    {
        ...
        /** Vendor name used to identify specific hardware requested */
        char name[MAX_NAME];
        ...
    }

Bindgen 创建的绑定如下所示:

    pub struct Properties
    {
        ...
        pub name: [::std::os::raw::c_char; 256usize],
        ...
    }

我的代码需要以某种方式填充此字段。我尝试过这样的事情:

    //property.name is of type [i8; 256]
    property.name = *("myName".as_bytes()) as [i8; 256];

这会导致如下错误:

non-primitive cast: `[u8]` as `[i8; 256]`
an `as` expression can only be used to convert between primitive types or to coerce to a specific trait object

这实际上应该更像是一个字符串复制函数。 我目前的解决方案似乎可行,但不是很干净,它定义了一个函数来遍历切片并将其字符一个一个地放入数组中。必须有更好的方法来做到这一点:

    pub fn strcpy_to_arr_i8(out_arr: &[i8; 256], in_str: &str) -> Result<(), SimpleError> {
        if in_str.len() > 256 {
            bail!("Input str exceeds output buffer size.")
        }

        for (i, c) in in_str.chars().enumerate() {
            out_arr[i] = c as i8;
        }   
        Ok(())
    }

Rust 有字节文字,所以 "myName".as_bytes() 是不必要的。 b"myName"会给你一个字节数组(注意开头的b)。

但是这些文字是无符号字节 (u8)。由于您似乎需要带符号的字节,因此需要转换它们:(*b"adfadsf").map(|u| u as i8).

也有可能 C-string 必须以 0 结尾。做到这一点,您需要在字符串末尾明确添加 [=15=]