В целом я согласен с ответом Егора Скриптунова.Для более обобщенного подхода (и, возможно, излишнего перегиба в данном конкретном случае) можно использовать тип объединения
local ffi = require 'ffi'
local union_type = ffi.typeof [[
union {
char bytes[4];
uint32_t integer;
}
]]
local union = union_type { bytes = 'abcd' }
print(string.format('0x%x', union.integer))
, отметив, что вам нужно беспокоиться о порядке байтов здесь;Вы можете подтвердить порядковый номер вашей системы с помощью ffi.abi('le')
или ffi.abi('be')
.Если вы получаете вашу строку откуда-то еще (например, по сети), ее порядковый номер, скорее всего, где-то задокументирован.
Предположим, что вы хотите интерпретировать строку из приведенного выше примера (abcd
) как big endian;тогда вы можете сделать это
local union do
if ffi.abi('le') then
union = union_type { bytes = ('abcd'):reverse() }
else
union = union_type { bytes = 'abcd' }
end
end
Если система имеет младший порядок, переверните строку.В противном случае оставьте все как есть.