問題1:將整數轉換為位元組陣列的最快方法是什么?
a = 1026
aHexStr = string(a,base = 16,pad = 4) #2 bytes, 4 chars
b = zeros(UInt8,2)
k = 1
for i in 1:2:4
b[k] = parse(UInt8,aHexStr[i:i 1],base = 16)
k = 1
end
這種方法是最快的嗎?
相關問題2:將十六進制字串轉換為位元組陣列的最快方法是什么?
我有一串十六進制數字
a = "ABCDEF12345678"
How can I convert this hex string to byte array?
b = zeros(UInt8,7)
k = 1
for i in 1:2:14
b[k] = parse(UInt8,a[i:i 1],base = 16)
k = 1
end
這種方法是最快的嗎?
uj5u.com熱心網友回復:
對于第一個問題,reinterpret如果您可以接受額外的 0 值,則可以使用位元組:
julia> reinterpret(UInt8, [a])
8-element reinterpret(UInt8, ::Vector{Int64}):
0x02
0x04
0x00
0x00
0x00
0x00
0x00
0x00
這比 Bogumi? Kamiński 答案中的代碼略快 5-10% - 但相差幾納秒。因此,如果額外的 0 很麻煩,那可能就不值得了。
uj5u.com熱心網友回復:
對于第一個操作,我假設您只想保留整數中設定的位元組數,因此您可以這樣做:
julia> a = 1026
1026
julia> [(a>>((i-1)<<3))%UInt8 for i in 1:sizeof(a)-leading_zeros(a)>>3]
2-element Vector{UInt8}:
0x02
0x04
解釋:
leading_zeros(a)獲取以a開頭的零位數leading_zeros(a)>>3計算完全為空的位元組數(>>3將數字3右移;在這種情況下,地板除以 8)sizeof(a)-leading_zeros(a)>>3計算要轉換的位元組數(i-1)<<3)計算我們需要移動索引的位數(在本例中為i-18 倍)(a>>((i-1)<<3))%UInt8獲取第i-1th 個位元組a
對于第二個操作,我假設如果您有奇數個字符,我們會用 0 位 填充最后一個位元組的剩余部分,我們不需要檢查傳遞的資料是否有效:
julia> a = "ABCDEF12345678"
"ABCDEF12345678"
julia> function s2b(a::String)
b = zeros(UInt8, (sizeof(a) 1) >> 1)
for (i, c) in enumerate(codeunits(a))
b[(i 1)>>1] |= (c - (c < 0x40 ? 0x30 : 0x37))<<(isodd(i)<<2)
end
return b
end
s2b (generic function with 1 method)
julia> s2b(a)
7-element Vector{UInt8}:
0xab
0xcd
0xef
0x12
0x34
0x56
0x78
這兩種方法都應該很快,但很難保證它們是最快的。
編輯
基準:
julia> function f1(a)
aHexStr = string(a,base = 16,pad = 4) #2 bytes, 4 chars
b = zeros(UInt8,2)
k = 1
for i in 1:2:4
b[k] = parse(UInt8,aHexStr[i:i 1],base = 16)
k = 1
end
return b
end
f1 (generic function with 1 method)
julia> f2(a) = [(a>>((i-1)<<3))%UInt8 for i in 1:sizeof(a)-leading_zeros(a)>>3]
f2 (generic function with 1 method)
julia> using BenchmarkTools
julia> a = 1026
1026
julia> @btime f1($a)
141.795 ns (5 allocations: 224 bytes)
2-element Vector{UInt8}:
0x04
0x02
julia> @btime f2($a)
29.317 ns (1 allocation: 64 bytes)
2-element Vector{UInt8}:
0x02
0x04
julia> function s2b(a::String)
b = zeros(UInt8, (sizeof(a) 1) >> 1)
for (i, c) in enumerate(codeunits(a))
b[(i 1)>>1] |= (c - (c < 0x40 ? 0x30 : 0x37))<<(isodd(i)<<2)
end
return b
end
s2b (generic function with 1 method)
julia> a = "ABCDEF12345678"
"ABCDEF12345678"
julia> @btime hex2bytes($a)
50.000 ns (1 allocation: 64 bytes)
7-element Vector{UInt8}:
0xab
0xcd
0xef
0x12
0x34
0x56
0x78
julia> @btime s2b($a)
48.830 ns (1 allocation: 64 bytes)
7-element Vector{UInt8}:
0xab
0xcd
0xef
0x12
0x34
0x56
0x78
正如@SundarR 在后一種情況下評論的那樣,hex2bytes應該使用。我忘記了它的存在。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/417382.html
標籤:
上一篇:從使用Blueprism生成的JSONAPI回應中提取欄位
下一篇:如何僅獲取特定的一段json資料
