從字節轉換爲int(注意字節序的字節級和符號性):
function bytes_to_int(str,endian,signed) -- use length of string to determine 8,16,32,64 bits
local t={str:byte(1,-1)}
if endian=="big" then --reverse bytes
local tt={}
for k=1,#t do
tt[#t-k+1]=t[k]
end
t=tt
end
local n=0
for k=1,#t do
n=n+t[k]*2^((k-1)*8)
end
if signed then
n = (n > 2^(#t*8-1) -1) and (n - 2^(#t*8)) or n -- if last bit set, negative.
end
return n
end
雖然我們在這也向另一個方向:
function int_to_bytes(num,endian,signed)
if num<0 and not signed then num=-num print"warning, dropping sign from number converting to unsigned" end
local res={}
local n = math.ceil(select(2,math.frexp(num))/8) -- number of bytes to be used.
if signed and num < 0 then
num = num + 2^n
end
for k=n,1,-1 do -- 256 = 2^8 bits per char.
local mul=2^(8*(k-1))
res[k]=math.floor(num/mul)
num=num-res[k]*mul
end
assert(num==0)
if endian == "big" then
local t={}
for k=1,n do
t[k]=res[n-k+1]
end
res=t
end
return string.char(unpack(res))
end
任何歡迎您發表評論,但已經過測試,但不會太透徹...
看起來很簡單和優雅,但我似乎沒有'結構'擴展模塊。 luarocks無法通過錯誤來編譯/安裝。將嘗試解決這個問題,並嘗試這一點。謝謝! – 2011-03-09 20:24:18
@ michal-kottman,在修復luarocks並安裝'struct'之後嘗試了代碼,但是對於第二個參數解包(即str)不是字符串的第二個參數。調試我試過這個小代碼(這不小心,但似乎並沒有像預期的那樣工作 - '> str = string.char(0x00,0xff)' '> local u16 = struct.unpack( ' print(u16)' 'nil' –
2011-03-10 14:30:19
@ michal-kottman,對不起!修正了它,需要在Lua 5.1中稍作修改(至少在我的系統中)。 a:'struct = require(「struct」)' – 2011-03-10 15:35:29