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
这是高效的。但同样,这根本不是一个重新解释的操作