将切片转换为数组
Converting a slice to an array
我有一个切片,我保证(在运行时)它的长度至少为 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];
你可以通过 std.mem.copy
var array = slice[0..8].*;
或使用std.mem.copy
std.mem.copy(u8, &array, slice[0..2]);
虽然我认为您只需要将 slice[0..8]
作为参数而不是创建变量
鉴于您的目标,如果对齐可行,您可以将切片指针转换为指向 f64 的指针:@ptrCast(*f64, slice.ptr)
。这使您甚至不必复制任何内容,以防您根本不需要这样做。
请注意,bytesAsValues 是一个使用编译器内置函数的 stdlib 函数,如果签名不符合您的需求,您可以跳过它并直接使用内置函数,就像我上面提到的那样。不要害怕阅读 stdlib 源代码。
这是一个天赐良机 link,其中包含一些有关如何就地进行转换(通过转换指针)以及如何立即将所有内容复制为浮点数的示例:https://zig.godbolt.org/z/3Y9o5zvfe
我有一个切片,我保证(在运行时)它的长度至少为 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];
你可以通过 std.mem.copy
var array = slice[0..8].*;
或使用std.mem.copy
std.mem.copy(u8, &array, slice[0..2]);
虽然我认为您只需要将 slice[0..8]
作为参数而不是创建变量
鉴于您的目标,如果对齐可行,您可以将切片指针转换为指向 f64 的指针:@ptrCast(*f64, slice.ptr)
。这使您甚至不必复制任何内容,以防您根本不需要这样做。
请注意,bytesAsValues 是一个使用编译器内置函数的 stdlib 函数,如果签名不符合您的需求,您可以跳过它并直接使用内置函数,就像我上面提到的那样。不要害怕阅读 stdlib 源代码。
这是一个天赐良机 link,其中包含一些有关如何就地进行转换(通过转换指针)以及如何立即将所有内容复制为浮点数的示例:https://zig.godbolt.org/z/3Y9o5zvfe