rust - 如何从文字字节表达式构造 const 整数?

标签 rust byte constants data-conversion

有没有办法从文字字节表达式构造一个const整数,使用字节字符串或构造整数的宏?

例如:

const MY_ID:   u16 = u16_code!(ID);
const MY_WORD: u32 = u32_code!(WORD);
const MY_LONG: u64 = u64_code!(LONGWORD);

或者类似的东西,传入 b"ID" 而不是 ID*

当传递了错误数量的字符时,它也应该无法编译,这是我在对文字字节字符串使用位移位时无法弄清楚如何实现的。


这是一个简单的示例,可以在基本级别上运行,但无法确保参数大小正确。

// const MY_ID: u16 = u16_code!(b"ID");
#[cfg(target_endian = "little")]
macro_rules! u16_code {
    ($w:expr) => { ((($w[0] as u16) <<  0) | (($w[1] as u16) <<  8)) }
}
#[cfg(target_endian = "big")]
macro_rules! u16_code {
    ($w:expr) => { ((($w[1] as u16) <<  0) | (($w[0] as u16) <<  8)) }
}

* 查看相关问题:Is there a byte equivalent of the 'stringify' macro?

最佳答案

您可以通过对数组进行索引并将各部分移位到正确位置来为每种类型构建一个宏。 u16 的示例表达式是

((b"ID"[0] as u16) << 8) | (b"ID"[1] as u16)

您可以用来自 $e:expr 的宏替换 $e 替换 b"ID"

为了实现长度校验,可以插入一个无用的*$e as [u8; 2],如果类型不匹配,将编译失败。

关于rust - 如何从文字字节表达式构造 const 整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42199727/

相关文章:

casting - 我是否过多地转换了整数类型?

c - c中的字节顺序反转

c++ - 无法通过引用传递的参数维护 const 正确性

rust - 无法将功能移至另一个文件?

json - 如何在不丢失任何值的情况下反序列化具有重复键的JSON?

rust - 在关联类型和迭代器的上下文中需要类型注释

java - 在 Java 中将字节转换为二进制

byte - 从 php.ini 中的速记字节表示法获取字节值

c - 将 C 函数的返回类型设为 const 有什么用?

c++ - 删除指向 const (T const*) 的指针