当前位置: 首页 > 知识库问答 >
问题:

从切片构建数组的正确方法?[重复]

毛胜
2023-03-14

好吧,这看起来有点傻,但是我很难找到一个函数来从切片的内容返回静态大小的数组。

关于阵列和切片的铁锈书章节对此一无所知。(它确实显示了如何从数组中获取切片,但我想换一种方式。)我还检查了std::slicestd::array的文档,但是如果它在那里,我就看不到它了。

当然,可以一个接一个地写下每个元素,但这似乎很荒谬。现在,我最终写了一个python单行线来为我做这件事。

", ".join(["k[{}]".format(i) for i in range(32)])

所以我最后得到了这个:

use db_key::Key;

#[derive(Clone)]
pub struct Sha256{
    bits : [u8;32]
}

impl Key for Sha256 {
    fn from_u8(k: &[u8]) -> Self {
        Sha256{bits:
               // FIXME: This is dumb.
               [ k[0], k[1], k[2], k[3], k[4], k[5], k[6], k[7], k[8], k[9], k[10], k[11], k[12], k[13], k[14], k[15], k[16], k[17], k[18], k[19], k[20], k[21], k[22], k[23], k[24], k[25], k[26], k[27], k[28], k[29], k[30], k[31] ]
        }
    }
    fn as_slice<T, F: Fn(&[u8]) -> T>(&self, f: F) -> T {
        f(&self.bits)
    }
}

我想知道是否有合适的方法,比如k.to_array(32)或者类似的方法。

而且,是的,我意识到上面的代码可能会由于越界访问而失败。我不确定db_key::key对无效输入的期望。

编辑:

有没有好的方法将Vec转换为数组?相似但不太普遍。对此的一个好答案可能也是对这个问题的一个好答案,除了从vec中获取一个片段,这可以高效而简洁地完成。我也不认为“为你关心的每个尺寸写一个单独的转换函数”是一个合适的解决方案。

如何在rust中获得作为静态数组的切片?也很相似,但公认的答案是我已经独立提出的黑客。

共有1个答案

瞿博学
2023-03-14

您可以使用循环以简单(但可能令人失望)的方式解决它:

let input = b"abcdef";
let mut array = [0u8; 32];
for (x, y) in input.iter().zip(array.iter_mut()) {
    *y = *x;
}

我们可以使用函数进行运行时大小检查,并将切片转换为对固定大小数组的引用。

Libstd没有提供足够的特性来可靠地检查输入和输出类型是否匹配,但理论上我们可以自己开发(对于有限数量的数组类型)。无论哪种方式,强制转换都是这样的,U是您指定的任意数组类型。

/// Return a reference to a fixed size array from a slice.
///
/// Return **Some(array)** if the dimensions match, **None** otherwise.
///
/// **Note:** Unsafe because we can't check if the **U** type is really an array.
pub unsafe fn as_array<T, U>(xs: &[T]) -> Option<&U> where
    U: AsRef<[T]>,
{
    let sz = std::mem::size_of::<U>();
    let input_sz = xs.len() * std::mem::size_of::<T>();

    // The size check could be relaxed to sz <= input_sz
    if sz == input_sz {
        Some(&*(xs.as_ptr() as *const U))
    } else {
        None
    }
}
 类似资料:
  • 问题内容: 要声明一个具有固定大小的空切片,最好这样做: 要么: 只想知道哪种方法是正确的。 问题答案: 您提供的两个选择在语义上是相同的,但是使用会导致内部调用 runtime.makeslice (Go 1.14)。 您还可以选择保留其值: 如Golang.org博客中所述: nil切片在功能上等效于零长度切片,即使它没有指向任何内容。它的长度为零,可以附加分配。 甲片段将然而入而空片将编组成

  • 要声明大小不固定的空切片,最好执行以下操作: 或: 只是想知道哪一个是正确的方法。

  • 问题内容: 我有一个熊pandas据框:数据。它具有列[“ name”,’A’,’B’] 我想做的(和可以做的)是: 这会将表行上的A列设置为0。我还完成了以下操作: 但是,两者都给我同样的警告: pandas如何让我做到这一点? 问题答案: 这是熊猫的一种非常普遍的警告。这意味着您正在写副本切片,而不是原始数据,因此由于混淆的链式分配,它可能不适用于原始列。请阅读这篇文章。它对此进行了详细的讨论

  • 本文向大家介绍Powershell创建数组正确、更快的方法,包括了Powershell创建数组正确、更快的方法的使用技巧和注意事项,需要的朋友参考一下 通常当新的对象添加到一个数组中,根据经验你最担心其性能问题。下面第一个例子将告诉你一个错误的操作方法: 在这个循环中,这个数组通过符号“+=”增加了许多新的对象。这样做会需要很长时间,因为在你改变其大小时Powershell每次需要去创造一个新的数

  • 我有一个数据框架:数据。它有列[“名称”、“A”、“B”] 我想做(和工作)的是: 这会将fred行上的列A设置为0。我还做了: 然而,两者都给了我同样的警告: 熊猫想让我怎么做?

  • 好吧,大约一年前,我写了一个网络应用程序,帮助我父亲的公司安排约会。他现在“没有它就做不成生意”。我决定用它建立一个SAAS订阅模型,并向公众开放。 它目前建立在codeigniter和php上,我认为这不适合SAAS版本。我计划在laravel 4中从头开始重建它,并使用stripe作为支付网关。 我关心的是如何最好地处理多个客户机的数据库/应用程序结构。目前,它只服务于一家公司,非常抽象,而且