【问题标题】:How to create a byte slice constant with specific value?如何创建具有特定值的字节切片常量?
【发布时间】:2020-07-18 08:02:47
【问题描述】:

如何在rust中创建字节切片常量,如下?

// This does not compile, but just to show my intention.
pub const MyConst: &'static [u8; 256] = b"abcdef" + [0u8; 250];

// Basically, the value is b"abcdef00000...", the `000...` appended at the end 
// are a series of byte 0, not character 0.

【问题讨论】:

  • 您可以使用 const 函数执行此操作,或者手动编写常量:b"abcdef\0\0\0\0\0\0\0\0..."。更多上下文将有助于您了解为什么需要它。
  • 我不确定是否有 const 函数可以与 [u8; 256] 一起使用。我认为你必须手写这个。如果它可以是 static 而不是 const,那么还有更多选项(例如 lazy_static)。

标签: rust


【解决方案1】:

您可以使用const fn 来创建您的数组:

const fn foo() -> [u8; 256] {
    let mut a = [0; 256];
    a[0] = b'a';
    a[1] = b'b';
    a[2] = b'c';
    a[3] = b'd';
    a[4] = b'e';
    a[5] = b'f';
    a
}

const FOO: [u8; 256] = foo();

fn main() {
    println!("{:?}", &FOO[0..10]);
}

请注意,const fn 仍然非常有限,所以据我所知,目前你不能比a[i] = b 的序列做得更好。

【讨论】:

    【解决方案2】:

    目前在语言和标准库中都没有在编译时将多个字节数组组合成单个切片的功能。恰好有一个pending RFC 提议对concat! 宏进行扩展,该宏目前仅适用于字符串文字。但是,不能保证它会被批准。

    以下是一些替代解决方案。

    1. 制作一个 UTF-8 字符串并调用 as_bytes()。然而,作为字符串切片,它不可能包含某些字符组合或编写[0u8; 250] 的紧凑表示。
    pub const BYTES: &[u8] = concat!("abcdef", "\0\0\0\0\0\0\0\0\0\0").as_bytes();
    
    1. 有些板条箱可能声称可以提供您正在寻找的解决方案。见proc_concat_bytes,例如:
    use proc_concat_bytes::concat_bytes;
    let c_str  = &concat_bytes!(b"Hello World!", b'\0')[..]).unwrap();
    
    1. 将字节写入文件,然后使用include_bytes!
    const BYTES: &[u8; 258] = include_bytes!("bytes.bin");
    
    1. 进入before-mainland并用lazy_static!构造一个静态向量。然后我们将有一个由程序构建的向量,但一旦构建就应该满足预期的要求。
    use lazy_static::lazy_static;
    
    lazy_static! {
        static ref BYTES: Vec<u8> = {
            let mut data = b"abcdefg".to_vec();
            data.extend(&[0u8; 250][..]);
            data
        };
    }
    

    另见:

    【讨论】:

      【解决方案3】:

      在最近的夜间编译器上,您现在可以使用 unstable concat_bytes! macro 来执行此操作:

      #![feature(concat_bytes)]
      pub const MY_CONST: &[u8; 256] = concat_bytes!(b"abcdef", [0; 250]);
      

      【讨论】:

        猜你喜欢
        • 2022-06-14
        • 2016-04-16
        • 1970-01-01
        • 2021-08-08
        • 2016-08-24
        • 2019-08-07
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        相关资源
        最近更新 更多