Хлопать необработанные аргументы байтов

Я хотел бы использовать необработанный байтовый аргумент с хлопком

Например, --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]

Спасибо

Укажите существующий код. У вас есть ошибки? Что вы пробовали?

PitaJ 06.05.2022 19:08

Попробуйте as_bytes() метод прямо на OsStr.

isaactfa 06.05.2022 19:12

В частности, @isaactfa недоступен в Windows. stackoverflow.com/a/43093946/847382

PitaJ 06.05.2022 19:18

@PitaJ Это примечательно! Хотя использование echo -e заставляет меня поверить, что OP использует какую-то оболочку Unix.

isaactfa 06.05.2022 19:22

Я обновил сообщение с кодом и ответом. Использование as_bytes не работает. Я хотел бы получить значения байтов ascii, насколько это возможно, используя golang или python.

amaelFr 06.05.2022 21:26

Пожалуйста, предоставьте минимальный исполняемый пример, в вашем примере отсутствуют операторы main() и необходимые операторы use

Finomnis 07.05.2022 10:12
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
6
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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.

Другие вопросы по теме