我想在clap中使用原始字节参数。
例如,--raw $(echo -n -e 'B\x10CC\x01\xff')将为我提供以下字节数组[66, 16, 67, 67, 1, 239, 191, 189] (使用to_string_lossy().to_bytes())。
是否有一种方法可以使用clap获得确切的字节数组?
编辑
let cmd = Command::new(
env!("CARGO_CRATE_NAME")
).bin_name(
env!("CARGO_CRATE_NAME")
).arg(
Arg::new("raw").long("raw").takes_value(true).allow_invalid_utf8(true)
);
let matches = cmd.get_matches();
match matches.value_of_os("raw") {
Some(s) => {
match s.to_str() {
Some(s3) => {
let v2: &[u8] = s3.as_bytes();
println!("OsStr(bytes):{:?}", v2);
},
None => {},
}
let s2 = s.to_string_lossy();
println!("string_from_OsString:{}", s2);
let v3: &[u8] = s2.as_bytes();
println!("OsString.to_lossy(bytes):{:?}", v3);
},
None => {},
}返回输入--原始$(echo -n -e 'B\x10CC\x01\xff')
string_from_OsString:BCC�
OsString.to_lossy(bytes):[66, 16, 67, 67, 1, 239, 191, 189]谢谢
发布于 2022-05-07 08:33:13
clap与平台无关,因此使用抽象,如OsString (这是s变量的类型)。
似乎没有一般的as_bytes()方法附加到OsString,因为并不是每个操作系统上的OsString实际上都是一个原始字节数组。
下面是关于这个主题的更多讨论:在Windows上?
因此,要解决问题,似乎有必要将兼容性缩小到特定的操作系统。在您的例子中,您似乎正在使用Unix。这很好,因为对于Unix,这样的方法确实存在!
给你:
use clap::{Arg, Command};
use std::os::unix::ffi::OsStrExt;
fn main() {
let cmd = Command::new(env!("CARGO_CRATE_NAME"))
.bin_name(env!("CARGO_CRATE_NAME"))
.arg(
Arg::new("raw")
.long("raw")
.takes_value(true)
.allow_invalid_utf8(true),
);
let matches = cmd.get_matches();
match matches.value_of_os("raw") {
Some(s) => {
println!(".as_bytes(): {:?}", s.as_bytes());
}
None => {}
}
}.as_bytes(): [66, 16, 67, 67, 1, 255]请注意,use std::os::unix::ffi::OsStrExt;将向OsString添加.as_bytes()功能,但无法在非unix系统上编译。
https://stackoverflow.com/questions/72145042
复制相似问题