我想在Lua中翻译以下代码段:
def toLong(s):
ls = [ord(i) for i in s]
l = len(ls) -1
sum = 0
for i, v in enumerate(ls):
sum += v*(256**(l-i))
return sum
print(toLong("\x00\x00\x01f\xd3d\x80X"))
它会打印原始号码:1541144871000
如果安装bigint,则此版本可与lua 5.2一起使用:
local bigint = require "bigint"
function toLong(s)
ret = bigint:new(0)
for i=1,string.len(s),1 do
-- (leftshift(8) is just like times-256, but faster)
ret = ret:leftshift(8) + bigint:new(string.byte(s, i))
end
return ret
end
在lua 5.2之前,不支持“ \ xAB”样式的语法,但是对于ASCII大写字母A,您可以使用“ \ 65”之类的小数。
顺便说一句,您可以在没有bigint的情况下执行此操作,例如:
function numLong(s)
ret = 0
for i=1,string.len(s),1 do
ret = (ret * 256) + string.byte(s,i)
end
return ret
end
最大的区别在于,bigint将表示任意大的数字,而在Lua中,默认情况下,常规数字值是浮点型,并且对实际可用的位数具有精度限制(尽管在我的机器上,这两种表示形式是相同的当我测试您的具体情况时)。
就是说:如果您需要任意大数字表示,请使用bigint或疯狂。
哦,顺便说一句:您确实意识到自己在计算数字时使用的是big-endian(或“网络字节顺序”),对吗?请务必在char字符串和uint64s之间进行交换(特别是如果目标计算机是像Intel盒一样的低端字节序)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句