Advertisement
Reactor_Games

Untitled

Jul 29th, 2021
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.54 KB | None | 0 0
  1. --====================================================================--
  2. -- Module: Ascii 85 Encoding in Pure Lua
  3. -- Author : Satheesh
  4. --
  5. -- License: MIT
  6.  
  7. -- Version : 1.1
  8. -- ChangeLog
  9. -- 1.1
  10. -- Minor bug fixed
  11. -- All-Zero group will be represented as 'z'
  12. --
  13. --
  14. -- Usage:
  15. --
  16. -- local ascii85 = require "ascii85"
  17. --
  18. -- local input = "Sample_Input"
  19. -- local enc = ascii85.encode(input)
  20. -- local dec = ascii85.decode(enc)
  21. --====================================================================--
  22.  
  23.  
  24. local floor = math.floor
  25. local tostring = tostring
  26. local table_insert = table.insert
  27.  
  28.  
  29. local function decimalToBase85(num)
  30. local base = 85
  31.  
  32. local final = {}
  33. while num > 0 do
  34. table_insert(final,1,num % base)
  35. num = floor(num / base)
  36. end
  37.  
  38. while #final < 5 do
  39. table_insert(final,1,0)
  40. end
  41.  
  42. return final
  43. end
  44.  
  45.  
  46.  
  47. local function base85ToDecimal(b85)
  48. local base = 85
  49.  
  50. local l = #b85
  51. local final = 0
  52.  
  53. for i=l,1,-1 do
  54. local digit = b85[i]
  55. local val = digit * base^(l-i)
  56. final = final + val
  57. end
  58.  
  59. return final
  60. end
  61.  
  62.  
  63. local function decimalToBinary(num)
  64. local base = 2
  65. local bits = 8
  66.  
  67. local final = ""
  68. while num > 0 do
  69. final = "" .. (num % base ) .. final
  70. num = floor(num / base)
  71. end
  72.  
  73. local l = final:len()
  74. if l == 0 then
  75. final = "0"..final
  76. end
  77.  
  78. while final:len()%8 ~=0 do
  79. final = "0"..final
  80. end
  81.  
  82. return final
  83. end
  84.  
  85.  
  86. local function binaryToDecimal(bin)
  87. local base = 2
  88.  
  89. local l = bin:len()
  90. local final = 0
  91.  
  92. for i=l,1,-1 do
  93. local digit = bin:sub(i,i)
  94. local val = digit * base^(l-i)
  95. final = final + val
  96. end
  97. return final
  98. end
  99.  
  100.  
  101.  
  102.  
  103. local function encode(substr)
  104.  
  105. local l = substr:len()
  106. local combine = ""
  107. for i=1,l do
  108. local char = substr:sub(i,i)
  109. local byte = char:byte()
  110. local bin = decimalToBinary(byte)
  111. combine = combine..bin
  112. end
  113.  
  114. local num = binaryToDecimal(combine)
  115. local b85 = decimalToBase85(num)
  116.  
  117. local final = ""
  118. for i=1,#b85 do
  119. local char = tostring(b85[i]+33)
  120. final = final .. char:char()
  121. end
  122.  
  123. if final == "!!!!!" then
  124. final = "z"
  125. end
  126.  
  127. return final
  128. end
  129.  
  130.  
  131.  
  132. local function decode(substr)
  133.  
  134. local final = ""
  135.  
  136. local l = substr:len()
  137. local combine = {}
  138. for i=1,l do
  139. local char = substr:sub(i,i)
  140. local byte = char:byte()
  141. byte = byte - 33
  142. combine[i] = byte
  143. end
  144.  
  145. local num = base85ToDecimal(combine)
  146. local bin = decimalToBinary(num)
  147.  
  148. while bin:len() < 32 do
  149. bin = "0"..bin
  150. end
  151.  
  152. local l = bin:len()
  153. local split = 8
  154. for i=1,l,split do
  155. local sub = bin:sub(i,i+split-1)
  156. local byte = binaryToDecimal(sub)
  157. local char = tostring(byte):char()
  158. final = final..char
  159. end
  160.  
  161. return final
  162. end
  163.  
  164.  
  165.  
  166. local function ascii_encode(str)
  167.  
  168.  
  169. local final = ""
  170.  
  171. local noOfZeros = 0
  172. while str:len()%4~=0 do
  173. noOfZeros = noOfZeros + 1
  174. str = str.."\0"
  175. end
  176.  
  177. local l = str:len()
  178.  
  179. for i=1,l,4 do
  180. local sub = str:sub(i,i+3)
  181. final = final .. encode(sub)
  182. end
  183.  
  184. final = final:sub(1,-noOfZeros-1)
  185. final = "<~"..final.."~>"
  186. return final
  187.  
  188. end
  189.  
  190.  
  191. local function ascii_decode(str)
  192.  
  193. local final = ""
  194.  
  195. str = str:sub(3,-3)
  196. str = str:gsub("z","!!!!!")
  197.  
  198. local c = 5
  199. local noOfZeros = 0
  200. while str:len()%c~=0 do
  201. noOfZeros = noOfZeros + 1
  202. str = str.."u"
  203. end
  204.  
  205.  
  206. local l = str:len()
  207. for i=1,l,c do
  208. local sub = str:sub(i,i+c-1)
  209. final = final .. decode(sub)
  210. end
  211.  
  212. final = final:sub(1,-noOfZeros-1)
  213. return final
  214.  
  215.  
  216.  
  217.  
  218. end
  219.  
  220.  
  221.  
  222. return {encode = ascii_encode,decode = ascii_decode}
  223.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement