Julia 朱莉娅:什么;这与重新解释相反吗?

Julia 朱莉娅:什么;这与重新解释相反吗?,julia,Julia,我们可以这样做,将UInt8数组转换为UInt64 reinterpret(UInt64, rand(UInt8, 8)) 这有相反的说法吗?要将UInt64转换为Vector{UInt8}?只需重新解释。请记住,reinterpret使某些东西的行为类似于数组,即使其长度为1 julia> a8 = rand(UInt8, 8) 8-element Array{UInt8,1}: 0x25 0xaf 0x2c 0x33 0xca 0xbe 0xd8 0xa6 juli

我们可以这样做,将
UInt8
数组转换为
UInt64

reinterpret(UInt64, rand(UInt8, 8))

这有相反的说法吗?要将
UInt64
转换为
Vector{UInt8}

只需重新解释。请记住,reinterpret使某些东西的行为类似于数组,即使其长度为1

julia> a8 = rand(UInt8, 8)
8-element Array{UInt8,1}:
 0x25
 0xaf
 0x2c
 0x33
 0xca
 0xbe
 0xd8
 0xa6

julia> a64 = reinterpret(UInt64, a8)
1-element reinterpret(UInt64, ::Array{UInt8,1}):
 0xa6d8beca332caf25

julia> a8 = reinterpret(UInt8, a64)
8-element reinterpret(UInt8, reinterpret(UInt64, ::Array{UInt8,1})):
 0x25
 0xaf
 0x2c
 0x33
 0xca
 0xbe
 0xd8
 0xa6

值得注意的是,
重新解释
有两种不同的工作方式。一种是将一个基元类型重新解释为另一个基元类型,如
reinterpret(Char,0x00000077)
。另一种方法是将T类型的数组重新解释为另一种类型的数组,如
重新解释(UInt128[1,2])
。在这两种情况下,这两种操作都不涉及实际更改或复制数据

如果您询问如何将bitstype(如UInt64)转换为数组,则情况有所不同,因为您实际上需要分配一个数组,从而复制数据。因此,您不是在“重新解释”现有数据,而是在创建新数据

可以使用指针执行此操作:

function to_array(x::UInt64)
    arr = Vector{UInt8}(undef, 8)
    GC.@preserve arr unsafe_store!(Ptr{UInt64}(pointer(arr)), x)
    return arr
end
这是高效的。但同样,这根本不是一个重新解释的操作