0

我有一个切片,我保证(在运行时)它的长度至少为 8。我想将该切片转换为一个数组,因为我需要使用std.mem.bytesAsValue()它来从原始字节创建一个f64(对于上下文,我正在实现二进制序列化格式)。

我像这样解决了它,但我想知道是否有更好的语法来实现相同的目标:

    var array: [8]u8 = undefined;
    array[0] = slice[0];
    array[1] = slice[1];
    array[2] = slice[2];
    array[3] = slice[3];
    array[4] = slice[4];
    array[5] = slice[5];
    array[6] = slice[6];
    array[7] = slice[7];
4

2 回答 2

1

你可以这样做std.mem.copy

var array = slice[0..8].*;

或使用std.mem.copy

std.mem.copy(u8, &array, slice[0..2]);

虽然我认为你可以只需要slice[0..8]作为参数而不是创建一个变量

于 2021-11-24T21:05:10.383 回答
1

鉴于您的目标,如果对齐成功,您可以将切片指针转换为指向 f64: 的指针@ptrCast(*f64, slice.ptr)。这使您甚至不必复制任何内容,以防您根本不需要这样做。

请注意,bytesAsValues 是一个使用编译器内置函数的 stdlib 函数,如果签名不符合您的需求,您可以跳过它并直接使用内置函数,就像我上面提到的那样。不要害怕阅读 stdlib 源代码。

这是一个godbolt链接,其中包含一些关于如何就地进行转换(通过投射指针)以及将所有内容立即复制为浮点数的示例:https ://zig.godbolt.org/z/3Y9o5zvfe

于 2021-11-24T23:51:03.743 回答