Я хотел бы использовать необработанный байтовый аргумент с хлопком
Например, --raw $(echo -n -e 'B\x10CC\x01\xff')
даст мне следующий массив байтов [66, 16, 67, 67, 1, 239, 191, 189]
(используя to_string_lossy().to_bytes()
).
Есть ли способ получить точный массив байтов с помощью хлопка?
РЕДАКТИРОВАТЬ
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 => {},
}
возврат для ввода --raw $(echo -n -e 'B\x10CC\x01\xff')
string_from_OsString:BCC�
OsString.to_lossy(bytes):[66, 16, 67, 67, 1, 239, 191, 189]
Спасибо
В частности, @isaactfa недоступен в Windows. stackoverflow.com/a/43093946/847382
@PitaJ Это примечательно! Хотя использование echo -e
заставляет меня поверить, что OP использует какую-то оболочку Unix.
Я обновил сообщение с кодом и ответом. Использование as_bytes не работает. Я хотел бы получить значения байтов ascii, насколько это возможно, используя golang или python.
Пожалуйста, предоставьте минимальный исполняемый пример, в вашем примере отсутствуют операторы main()
и необходимые операторы use
clap
не зависит от платформы и поэтому использует такие абстракции, как OsString
(это тип вашей переменной s
).
Похоже, что к as_bytes()
не привязан общий метод OsString
, потому что не в каждой операционной системе OsString
является на самом деле является необработанным массивом байтов.
Вот еще много обсуждений на эту тему: Как преобразовать OsStr в &[u8]/Vec<u8> в 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;
добавит функциональность .as_bytes()
к OsString
, но не сможет скомпилироваться в системах, отличных от Unix.
Укажите существующий код. У вас есть ошибки? Что вы пробовали?