Lua中像Python的编码(ord函数)

我想把下面的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

点赞
用户6020403
用户6020403

如果你安装了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”样式的语法是不支持的,但可以使用像“\65”这样的十进制数字来表示ASCII中的大写字母A。

顺便说一下,你也可以不使用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或发疯吧。

哦,顺便说一下:你知道自己正在使用大端字节序(或“网络字节序”)来计算你的数字吗?切换字符字符串和uint64之间一定要小心(特别是如果你的目标机器是像Intel盒子这样的小端字节序)……

2018-11-05 10:36:43