Skip to content

Instantly share code, notes, and snippets.

@tsuyoshicho
Created May 14, 2019 08:06
Show Gist options
  • Select an option

  • Save tsuyoshicho/e9dbeb3fab8ae6ed5969b91554768ee6 to your computer and use it in GitHub Desktop.

Select an option

Save tsuyoshicho/e9dbeb3fab8ae6ed5969b91554768ee6 to your computer and use it in GitHub Desktop.
uuid decode vim test
" UUID
" 0 1 2 3
" 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
" +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
" | time_low |
" +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
" | time_mid | time_hi_and_version |
" +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
" |clk_seq_hi_res | clk_seq_low | node (0-1) |
" +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
" | node (2-5) |
" +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
"
" hex string xxxxxxxx-xxxx-xxxx-Nxxx-xxxxxxxxxxxx
let s:uuidregex = '\x\{8}-\x\{4}-\x\{4}-\x\{4}-\x\{12}'
let s:uuid = {
\ 'uuid_hex': '',
\ 'string' : {
\ 'time_low' : '',
\ 'time_mid' : '',
\ 'time_hi_and_version' : '',
\ 'clock' : '',
\ 'node' : '',
\ },
\ 'bytes' : [],
\ 'value' : {
\ 'time_low' : [],
\ 'time_mid' : [],
\ 'time_hi_and_version' : [],
\ 'clk_seq_hi_res' : [],
\ 'clk_seq_low' : [],
\ 'node' : [],
\ },
\ 'version' : 0,
\ 'variant' : 0,
\}
function! s:uuiddecoder(uuid) abort
let data = a:uuid
" little endian : hex-string
" big endian : data sequence
let uuiddecode = deepcopy(s:uuid)
if data =~# s:uuidregex
let uuiddecode.uuid_hex = data
let uuiddecode.string.time_low = data[0:7]
" data[8] = '-'
let uuiddecode.string.time_mid = data[9:12]
" data[13] = '-'
let uuiddecode.string.time_hi_and_version = data[14:17]
" data[18] = '-'
let uuiddecode.string.clock = data[19:22]
" data[23] = '-'
let uuiddecode.string.node = data[24:36]
let uuiddecode.value.time_low = s:_le2be_dword(s:_str2bytes(uuiddecode.string.time_low))
let uuiddecode.value.time_mid = s:_le2be_word(s:_str2bytes(uuiddecode.string.time_mid))
let uuiddecode.value.time_hi_and_version = s:_le2be_word(s:_str2bytes(uuiddecode.string.time_hi_and_version))
let uuiddecode.value.clk_seq_hi_res = s:_str2bytes(uuiddecode.string.clock[0:1])
let uuiddecode.value.clk_seq_low = s:_str2bytes(uuiddecode.string.clock[2:3])
let uuiddecode.value.node =
\ s:_le2be_word(s:_str2bytes(uuiddecode.string.node[0:1]))
\ + s:_le2be_dword(s:_str2bytes(uuiddecode.string.node[2:5]))
let uuiddecode.bytes = uuiddecode.value.time_low
\ + uuiddecode.value.time_mid
\ + uuiddecode.value.time_hi_and_version
\ + uuiddecode.value.clk_seq_hi_res
\ + uuiddecode.value.clk_seq_low
\ + uuiddecode.value.node
else
throw 'vital: Data.UUID: format error'
endif
return uuiddecode
endfunction
function! s:_le2be_word(data) abort
return reverse(copy(a:data[0:1]))
endfunction
function! s:_le2be_dword(data) abort
return reverse(copy(a:data[0:3]))
endfunction
function! s:_str2bytes(str) abort
return map(range(len(a:str)), 'char2nr(a:str[v:val])')
endfunction
" UEFI system partition GUID
echomsg string(s:uuiddecoder('C12A7328-F81F-11D2-BA4B-00A0C93EC93B'))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment