如何将字符串“ [1、2、3]”转换为Vec <u8>?

时间:2019-10-01 14:15:17

标签: string vector rust byte

我正在使用AES-GCM-SIV通过TCP在客户端/服务器之间传递加密的消息。使用

将接收到的缓冲区转换为String并分成几个Vec<&str>
let v: Vec<&str> = buffer_string.split("?+").collect();

v的示例:

["POST / HTTP/1.1\\r\\n\\", "Uaxh5NUi098q", "178", "[162, 254, 28, 241, ... ]"]

v[3]应该是Vec<u8>的密文。向量如何用作Vec<u8>

iter().map(|c| *c as u8).collect()

将使用chars,而不是&str

这是一个完整的示例on the Playground

fn main() {
    let buffer_string = r##"POST /chat HTTP/1.1\r\n\?+rRMUG4Lg8Gi6?+178?+[136, 136, 144, 59, 173, 25, 204, 247, 151, 53, 2, 137, 100, 45, 198, 58, 65, 210, 134, 165, 163, 156, 136, 148, 46, 31, 16, 184, 179, 73, 220, 14, 113, 152, 85, 1, 233, 208, 53, 27, 124, 52, 41, 175, 86, 109, 134, 103, 93, 148, 208, 114, 123, 97, 18, 53, 149, 195, 51, 55, 213, 114, 184, 72, 109, 30, 217, 206, 212, 58, 253, 141, 9, 45, 173, 213, 96, 35, 77, 122, 113, 240, 22, 222, 194, 11, 123, 221, 176, 116, 161, 196, 84, 203, 203, 184, 140, 42, 169, 244, 211, 1, 189, 96, 16, 62, 173, 50, 65, 48, 176, 44, 176, 246, 246, 242, 18, 146, 105, 29, 13, 223, 185, 151, 114, 30, 27, 36, 48, 178, 16, 3, 250, 49, 229, 84, 121, 135, 197, 204, 42, 140, 220, 244, 73, 184, 250, 104, 125, 224, 219, 94, 111, 247, 92, 16, 168, 50, 249, 10, 65, 214, 217, 157, 7, 113, 217, 141, 174, 139, 183, 86, 17, 24, 221, 134, 222, 240]"##;

    let v: Vec<&str> = buffer_string.split("?+").collect();
    println!("Vector: v1 {:?}, v2 {:?}, v3: {:?}", v[1], v[2], v[3]);

    //only the v[3] is needed as vec<u8>
    //error with iter and &str
    //let ciphertext_vec: Vec<_> = v[3].iter().map(|c| c.parse::<u8>().unwrap()).collect();

    let ciphertext: Vec<u8> = [
        136, 136, 144, 59, 173, 25, 204, 247, 151, 53, 2, 137, 100, 45, 198, 58, 65, 210, 134, 165,
        163, 156, 136, 148, 46, 31, 16, 184, 179, 73, 220, 14, 113, 152, 85, 1, 233, 208, 53, 27,
        124, 52, 41, 175, 86, 109, 134, 103, 93, 148, 208, 114, 123, 97, 18, 53, 149, 195, 51, 55,
        213, 114, 184, 72, 109, 30, 217, 206, 212, 58, 253, 141, 9, 45, 173, 213, 96, 35, 77, 122,
        113, 240, 22, 222, 194, 11, 123, 221, 176, 116, 161, 196, 84, 203, 203, 184, 140, 42, 169,
        244, 211, 1, 189, 96, 16, 62, 173, 50, 65, 48, 176, 44, 176, 246, 246, 242, 18, 146, 105,
        29, 13, 223, 185, 151, 114, 30, 27, 36, 48, 178, 16, 3, 250, 49, 229, 84, 121, 135, 197,
        204, 42, 140, 220, 244, 73, 184, 250, 104, 125, 224, 219, 94, 111, 247, 92, 16, 168, 50,
        249, 10, 65, 214, 217, 157, 7, 113, 217, 141, 174, 139, 183, 86, 17, 24, 221, 134, 222,
        240,
    ]
    .to_vec();
    let ciphertext2: Vec<u8> = v[3].iter().map(|c| c.parse::<u8>().unwrap()).collect();
    assert_eq!(ciphertext, ciphertext2);

    // ciphertext: Vec<u8> =
}

1 个答案:

答案 0 :(得分:3)

我相信可以。

fn main() {
    let s = "[162, 254, 28, 241]";
    let v: Vec<u8> = s
        .trim_start_matches('[')
        .trim_end_matches(']')
        .split(',')
        .map(|c| c.trim().parse::<u8>().unwrap())
        .collect();

    for n in v {
        println!("{}", n);
    }
}

here试试。