【问题标题】:collect bytes from string从字符串中收集字节
【发布时间】:2022-08-20 03:25:12
【问题描述】:

这是从字节解码的字符串,它们总是不同的。我没有在代码中使用它,它只是为了显示所有内容。

\"Random String; Tags:Value1:1,Value:2,Value3:value4\"

这是我作为输入得到的来自上述字符串的字节数组。

[&u8...&u8]

我需要的是从中获取价值。虽然数组中的每个字节都在变化。但有些字节总是相同的。我在想是否有任何方法可以在不使用任何字符串的情况下提取它...感谢您的任何想法

所以输出看起来像这样:

let v1 = [&u8, &u8, &u8, &u8, &u8];
let v2 = [&u8, &u8];
let v3 = [&u8];
let v4 = [&u8];
let v5 = [&u8];
  • 为什么ELEMENT 的输出也是ELEMENT?它是所有其他关键字的破折号后的数字。
  • 不要介意名字,我只需要从数组中获取这些字节
  • 我不是在谈论名字。你想要10 对应ATTACK5 对应DEFENSE4 对应HIGHNESS1 对应SWAG,对吧?但是你想要ELEMENT 代替ELEMENT 而不是HYDRO
  • 那是错误的,我当然想要水电。对不起
  • 因为 SO 不是代码编写服务,所以我不会只为你编写程序。但这里有一些提示:字节切片,或 Rust 类型表示法中的 &[u8],与 Strings 非常相似。你可以索引它们,迭代它们,它们甚至有a lot of methods 的共同点。如果我要这样做,我可能会首先在输入中查找所有-,然后检查它们前面是否有一个关键字。如果是这样,获取- 之后但,; 之前的所有字节。

标签: arrays rust byte buffer


【解决方案1】:

您可以使用 rusts 迭代器、split 和相关函数来完成所有这些操作,而无需分配任何额外空间

在顶层,您的数据格式为 (key:value;)* 这建议首先拆分; 然后使用 : 将这些部分中的每一个拆分为键和值

在您的情况下,所有信息都是key"tags" 的时间。

然后在标签部分中,您再次(大部分)拥有(key-value,)* 形式的键值对,因此我们需要在, 上拆分,然后使用- 分解成键值对。

执行此操作但仅打印所有标签键值对的示例是:

fn split_kv(v: &[u8], c: u8) -> Option<(&[u8], &[u8])> {
    let n = v.iter().position(|&b| b == c)?;
    let w = v.split_at(n);
    Some((w.0, &(w.1)[1..]))
}

fn main() {
    let s: &str = "Background:Sunfire Topo;Base:Eagle;Accessory3:None;Patch:Oreo;Jacket:Pink Bonez;Eyes:BloodShot;Beak:Drool;Accessory2:Nose Ring;Accessory1:None;Item:Knife;tags:Dope Eagles,ELEMENT-HYDRO,ATTACK-10,DEFENSE-5,HIGHNESS-4,SWAG-1;metadata:QmU7JcFDoGcUvNkDgsPz9cy13md4xHdNyD6itwmgVLuo7x/860.json";
    let ss: &[u8] = s.as_bytes();

    let tags = ss
        .split(|&b| b == b';') // Break up at ';'
        .filter_map(|s| split_kv(s, b':')) // Split each piece into key-value pairs using ':'
        .filter_map(|(k, v)| { // Only keep the tags entry.
            if k == "tags".as_bytes() {
                Some(v)
            } else {
                None
            }
        }) 
        .next() // And just take the first of those.
        .unwrap(); 

    // Split the tags by ','
    for t in tags.split(|&b| b == b',') {
        // Then try to convert each to a key-value using '-' as seperator.
        if let Some((k, v)) = split_kv(t, b'-') {       
            println!(
                "k={:?} v={:?}",
                std::str::from_utf8(k).unwrap(),
                std::str::from_utf8(v).unwrap()
            );
        } else {
            println!("t={:?}", std::str::from_utf8(t).unwrap());
        }
    }
}

你可以运行这个here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2013-02-25
    • 1970-01-01
    • 2020-08-09
    相关资源
    最近更新 更多