如何从 &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=]
。
我正在使用一个由 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=]
。