Jump to content

Optimizacion de string.byte a gsub?


Recommended Posts

Se que se puede, pero no se como, si alguien puede decirme la forma en la que gsub hace exactamente lo mismo que esto que he hecho se lleva una galleta

str="Hola me llamo venado" 
local b = {} 
    for d=1, x:len()-1 do 
    table.insert(b, string.char(string.byte(str, d))) 
    end 
str = "" 
    for k,v in ipairs(b) do 
    str = str..v 
    end 
return str 
--Termina con un "Hola me llamo venad" 
  

Link to comment
  • Discord Moderators
Hidden

En primer lugar, tanto string.byte como string.char admiten varios caracteres a la vez, por lo que tu código se podría reducir a:

str="Hola me llamo venado" 
return string.char(string.byte(str, 1, #str)) -- "Hola me llamo venado" 

Aún así, también es posible usar string.gsub para lo que propones, aunque no lo recomiendo porque hace el script menos legible y más lento:

local function string.paddedbyte(s, i, j) 
    -- Igual que string.byte excepto porque devuelve números de 3 cifras siempre 
    local results = { } 
    for n = i or 1, j or (i or 1) do 
        local byte = string.byte(s, n) 
        table.insert(results, string.format("%03u", byte)) 
    end 
    return unpack(results) 
end 
  
str = "Hola me llamo venado" 
local bytestr = string.gsub(str, ".", string.paddedbyte) 
return string.gsub(bytestr, "%d%d%d", string.char) 

Link to comment
Es sub, no gsub.
  
str= "Hola me llamo venado" 
print(string.sub(str, 1, #str-1)) 
  

Gracias por un codigo mas limpio, no conocia exactamente la funcion de sub, gracias, solo sabia que se podia hacer con gsub a traves del $1 o como sea

En primer lugar, tanto string.byte como string.char admiten varios caracteres a la vez, por lo que tu código se podría reducir a:
str="Hola me llamo venado" 
return string.char(string.byte(str, 1, #str)) -- "Hola me llamo venado" 

Aún así, también es posible usar string.gsub para lo que propones, aunque no lo recomiendo porque hace el script menos legible y más lento:

local function string.paddedbyte(s, i, j) 
    -- Igual que string.byte excepto porque devuelve números de 3 cifras siempre 
    local results = { } 
    for n = i or 1, j or (i or 1) do 
        local byte = string.byte(s, n) 
        table.insert(results, string.format("%03u", byte)) 
    end 
    return unpack(results) 
end 
  
str = "Hola me llamo venado" 
local bytestr = string.gsub(str, ".", string.paddedbyte) 
return string.gsub(bytestr, "%d%d%d", string.char) 

Esto tambien es bueno pero me quedo con la de Tomas,

Gracias a los dos por la ayuda

Link to comment
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...