Кодирование в Lua как Python (функция ord) - PullRequest
0 голосов
/ 03 ноября 2018

Я хочу перевести следующий сегмент кода в 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

1 Ответ

0 голосов
/ 05 ноября 2018

Это работает с Lua 5.2, если вы устанавливаете bigint :

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) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...